Sign in

Ivan “CLOVIS” Canet

@ivcanet.bsky.social
413 followers 348 following 1.3K posts

Kotlin developer & teacher @ 4SH, learn more about me: ivan.canet.dev Open source at opensavvy.dev • @opensavvy.techhub.social.ap.brid.gy Organizing the Kotlin Bordeaux User Group at bordeauxkt.io

PostsRepliesMedia
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 11h
Yay new art!! Love your work!
040
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 11h
Interesting morning, getting gassed by the cops
100
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 29/09/2026
@obsidian.md is to Electron what Mamdani is to mayors "wait, it can do that??"
120
Reposted by Ivan “CLOVIS” Canet
Alejandro Serrano Mena @serranofp.com · 28/09/2026
I'm super happy to announce my latest project: the Builder Lambda plug-in! github.com/serras/build... This plug-in re-exposes builders from Java in a Kotlin-idiomatic way: as a lambda in which you set the different properties. The generated code has no trace, though, it calls the builder directly.
131
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 28/09/2026
I'll be organizing a workshop on Ktor at BDX I/O next month 👀 bdxio.fr/talks/814
bdxio.fr
BDX I/O
BDX I/O est une conférence pour les développeur•euse•s, sur les technologies de demain, organisée tous les ans depuis 2014 à Bordeaux.
010
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 28/09/2026
This is something I've been worrying about too. If we all hack around solo, where is the community? autonomousapps.com/blog/how-to-...
autonomousapps.com
How to lose a friend
On anti-systems approaches to software development
140
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 24/09/2026
Official KotlinConf 2026 pictures @lilywhiteout.bsky.social look bottom right on the screen 👀
250
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 22/09/2026
France has dozens of cities named variations of Chateauneuf for this reason
120
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 22/09/2026
Ah, organizing events Tonight we're doing the Kotlin Birthday. We had ~20 registered people last weekend when we ordered the cake. In the last 24 hours, 10 more people registered 😮
100
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 21/09/2026
Fun fact, if you create a `suspend` function that returns `COROUTINE_SUSPENDED`, the entire KotlinX.Coroutines library breaks down
110
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 20/09/2026
New design of the plugin settings, without different 'Marketplace' and 'Installed' tabs
030
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 18/09/2026
yay, I'm 72 popular Anyone knows what that means?
200
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 18/09/2026
am I cursed or does nothing work anymore?
Iberia Airlines website with a blank page that says "Sorry, we can't show you the flights. A general error has occurred."Air France with the search button that loads forever.easyJet showing "Error. We're very sorry but something has gone wrong. Please try again or get in contact with us if this issue continues to occur."
110
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 18/09/2026
New IntelliJ home page 👀
140
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 16/09/2026
I made it to the KotlinConf front page 👀
070
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 10/09/2026
Soon in KtMongo: integrated debug mode to understand why your aggregation pipeline doesn't do what you want!

A complex aggregation pipeline broken in multiple subfunctions can be tough to understand, especially when it returns the wrong results or no results at all. To facilitate understanding complex pipelines, KtMongo provides a [`debug`](../api/driver-api/opensavvy.ktmongo.api/-mongo-aggregation-pipeline/index.html#debug) method which returns intermediate results:
```kotlin
users.aggregate()
	.match { User::age gte 18 }
	.sort { ascending(User::age) }
	.limit(1)
	.also { println(it.debug()) } // Temporarily add when debugging, or call using the debugger
	.toList()
```
```terminaloutput
Pipeline debug (first 10 resulting documents after each stage):
  Stage: {}
    {"_id": {"$oid": "6aa304b526a3e786897e397a"}, "name": "Alice", "age": 30}
    {"_id": {"$oid": "6aa304b526a3e786897e397b"}, "name": "Bob", "age": 17}
    {"_id": {"$oid": "6aa304b526a3e786897e397c"}, "name": "Charlie", "age": 22}
  
  Stage: {"$match": {"age": {"$gte": 18}}}
    {"_id": {"$oid": "6aa304b526a3e786897e397a"}, "name": "Alice", "age": 30}
    {"_id": {"$oid": "6aa304b526a3e786897e397c"}, "name": "Charlie", "age": 22}
  
  Stage: {"$sort": {"age": 1}}
    {"_id": {"$oid": "6aa304b526a3e786897e397c"}, "name": "Charlie", "age": 22}
    {"_id": {"$oid": "6aa304b526a3e786897e397a"}, "name": "Alice", "age": 30}
  
  Stage: {"$limit": 1}
    {"_id": {"$oid": "6aa304b526a3e786897e397c"}, "name": "Charlie", "age": 22}
```

If a stage throws an exception, the debug method will say which one explicitly.
010
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 09/09/2026
“Romance is dead” Carrefour:
020
Reposted by Ivan “CLOVIS” Canet
Jaewoong Eum (skydoves) @skydoves.bsky.social · 08/09/2026
I just published a new open-source project, Now in Android KMP! This is a full Kotlin Multiplatform and Compose Multiplatform port of Google's Now in Android sample on Android, iOS, Desktop, and Wasm, github.com/skydoves/now...
github.com
GitHub - skydoves/nowinandroid-kmp: 📱 Now in Android KMP is a full Kotlin Multiplatform port of Google's Now in Android sample.
📱 Now in Android KMP is a full Kotlin Multiplatform port of Google's Now in Android sample. - skydoves/nowinandroid-kmp
3233
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 07/09/2026
BIG MILESTONE. The KtMongo Multiplatform prototype passes the integration test suite. Now it's the (long) stretch of 100%'ing the API
13,939 tests passed, 24 ignored, 13,983 tests total
011
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 05/09/2026
KtMongo Multiplatform is progressing so much these past weeks 👀
000
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 30/08/2026
MongoDB can be so simple at times And then be so strange
pipeline.aggregate()
    .set {
        User::profiles[0] set User::profiles[1]
    }

This writes the profile at index 1 into the profile at index 0, for every user

you'd think this symmetry would remain in BSON, but nooooo

[
    {
        $set: {
            "profiles.0": {
                $arrayElemAt: {
                    "$profiles",
                    { $literal: 1 }
                }
            }
        }
    }
]
110
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 30/08/2026
$unwind is very hard to support 😅
000
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 28/08/2026
Yay every binary KtMongo aggregation operator now has 16 overloads
010
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 25/08/2026
Interesting article. I need to learn Nix at some point ruuda.nl/2023/the-yam...
ruuda.nl
The yaml document from hell
As a data format, yaml is extremely complicated and it has many footguns. In this post I explain some of those pitfalls by means of an example, and I suggest a few simpler and safer yaml alternatives.
110
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 24/08/2026
Getting ready for September 🧘
040
Reposted by Ivan “CLOVIS” Canet
Develocity @gradle.com · 13/08/2026
Broken build script used to nuke your whole IDE sync -> 99 healthy projects go dark because 1 has a bad line. Gradle 9.7 + IntelliJ 2026.2 fix that. Resilient sync keeps completion alive in the file you're fixing. blog.gradle.org/resilient-sync
blog.gradle.org
Resilient Sync: Your IDE Keeps Helping even when your Build is Broken
Gradle 9.7 and IntelliJ IDEA 2026.2 bring resilient sync to IDE users. When part of your build fails to configure, Gradle still hands the IDE models for everything that succeeded, so you keep code com...
084
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 13/08/2026
Will Clacton be funny?
000
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 13/08/2026
South-west France!
040
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 12/08/2026
😱
130
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 11/08/2026
Hmmm what's that? 👀
000
Reposted by Ivan “CLOVIS” Canet
David Blanc @speekha.bsky.social · 10/08/2026
What a great way to make sure users pay even less attention to what's in the popups...
031
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 10/08/2026
We're getting ads in IntelliJ now (displayed on every push)
530
Reposted by Ivan “CLOVIS” Canet
Dominik 🔮 @tkdodo.eu · 03/08/2026
Don't be a meat proxy gruhn.me/blog/2026-08...
gruhn.me
Don't be a meat proxy
210321
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 02/08/2026
$lookup isn't easy to map to Kotlin, but I think that's pretty good?
// {
//    $lookup: {
//       from: "comments",
//       localField: "_id",
//       foreignField: "movie_id",
//       let: { movie_year: "$year" },
//       pipeline: [
//          { $match: { $expr: { $gt: [ { $year: "$date" }, "$$movie_year" ] } } },
//       ],
//       as: "post_release_comments"
//    }
// },
.lookup {
	into(Movie::post_release_comments)

	val movieYear = let(Movie::year)

	from(
		allComments
			.matchExpr { Comment::year gt movieYear }
	)

	on(Movie::_id, Comment::movieId)
}
040
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 02/08/2026
It's the old logo, and the code is PHP 🙈
030
Reposted by Ivan “CLOVIS” Canet
The Emotion Engine @emotion-engine.bsky.social · 31/07/2026
Isekai as a genre is exploding in popularity because it appeals to a universal desire to get hit by a truck rather than live in the 21st century.
4182953409
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 01/08/2026
In the last 12 months, 22% of publications in MavenCentral were in groups that use KMP, for a total of 93% of published artifacts
220
Reposted by Ivan “CLOVIS” Canet
Sophie Labelle @assignedmale.bsky.social · 31/07/2026
A dark day for human rights.
four frame comic. first frame shows the logo of amnesty international. second frame shows jk rowling, smiling in the dark. third frame shows an empty classroom, with a pride poster almost falling from the wall. fourth frame shows a trans flag flying in the wind. text above all the images reads : 
on july 8th, amnesty Inter-
national uk published a report
titled “A Growing Threat: The
Anti-Rights Movement in the UK.”
it listed 117 orgs, including anti-
trans and anti-queer ones
backed by jk rowling.
the backlash was immediate
and brutal : rowling pledged
to cover the fees of anyone
who wished to sue amnesty.
the report was taken down
within 48 hours.
this morning (july 31st), amnesty
fully capitulated and released
an apology to anti-trans orgs,
which, it said, should not have
been "collectively labelled as
anti-rights". rowling
celebrated.
an organisation that
bravely faced fascist regimes
and reported human rights
violations for 65 years has caved
to rowling's power and bigotry.
it's a dark day for human rights.
9779854049
Reposted by Ivan “CLOVIS” Canet
Ada Bee, Queen of September @mercury01.bsky.social · 31/07/2026
here's a new bumper sticker design
A parody of the Amnesty International logo (a stylized candle with barbed wire wrapped around it), with a hand coming out of the barbed wire and pinching the candle flame out. In place of "Amnesty International" is written "Sorry Miss Rowling / It won't happen again".
91605556
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 31/07/2026
What radicalized you? I remember the 2003 heatwave. I was a child (I know) but I vividly remember the asphalt boiling. At the time, the temperature reached 35°C (95°F). More than 15 000 people died in France, for a total of 72 000 deaths in Europe.
140
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 25/07/2026
In light blue: Bordeaux Quite a lot of smoke. Right now it's 4am, neighboring cities are being evacuated
100
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 23/07/2026
…yes?
Website complaining that a date should be in the future, but it's in 2 months already
000
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 23/07/2026
The goal of a DSL is to make incorrect code harder to write, and correct code easier to read If your DSL needs to be called in a specific order to work and otherwise silently fails, it's not a very good DSL
071
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 13/07/2026
👀 kotlinleeds.co.uk/schedule
001
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 11/07/2026
uhhhhhh ok?
The image shows garbled terminal output:

INFO    -  [07:41:56] Serving on http://0.0.0.0:8000/
2026-07-11T07:42:06.181474582Z WARNING -  [07:42:06] "  üé¡7óœÈ@‚a?¥dÖòÂä<XžŸüNëËÞZ}}+ Väû1‹ø" code 400
2026-07-11T07:42:06.182325954Z WARNING -  [07:42:06] "  üæEÀÇwíÂhÖ2&:`Æë¤dq·¶7·Q!T s}@ð¿‹Çõ=¸Ñp" code 400
010
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 10/07/2026
ScalaJS and 64-bit integers 👀 github.com/JetBrains/ko...
One concrete example: the following Scala.js method:

def foo(a: Long, b: Long, c: Long): Long =
  a + b - c
gets compiled to

$c_Lhelloworld_HelloWorld$.prototype.foo__J__J__J__J = (function(a_$_lo, a_$_hi, b_$_lo, b_$_hi, c_$_lo, c_$_hi) {
  var lo = ((a_$_lo + b_$_lo) | 0);
  var hi = ((((a_$_hi + b_$_hi) | 0) + (((lo >>> 0) < (a_$_lo >>> 0)) | 0)) | 0);
  var lo$1 = ((lo - c_$_lo) | 0);
  var hi$1 = ((((hi - c_$_hi) | 0) - (((lo$1 >>> 0) > (lo >>> 0)) | 0)) | 0);
  return $bL(lo$1, hi$1);
});
130
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 10/07/2026
Wow, unlikely!
A production-generated UUIDv4 where the fourth segment spells out 'beef'.
020
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 07/07/2026
what
000
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 04/07/2026
I'm not sure *why*, but apparently my test suite crashes MongoDB
140
Ivan “CLOVIS” Canet @ivcanet.bsky.social · 04/07/2026
Is there any language that generates stacktraces not by snapshotting the current call stack but by building it while unwinding? As in, have a code path on every function for "I'm propagating an error" that appends the current location to a linked list of "where you're coming from".
100