João Costa shared 5 days ago
João Costa shared 19 days ago
João Costa shared 25 days ago

I was checking out HTMX (downloaded the docs to read during the flight) and decided to add some sprinkles to this blog.

I want to keep this site working without any JS, so I just went for the basic hx-boost and hx-indicator.

I'm amazed by how well "It Just Works™". 🔥

It's obviously not as nice as a more complex JS integration, but it's such a quick win that I might start using this more often.

Here's RokRok, a Gopher Client written in Scala:

This is mostly a toy project to try out Minart + InterIm + Scala Native Multithreading, so don't expect too much.

I do plan to work on it a bit more, as it is a nice way to test InterIm features.

Just released InterIm 0.2.0, with Scala Native 0.5 support, implicit component layouts and some critical bug fixes.

I'll try to update Spaeti and finally release my Gopher client demo using this version soon. 🙂

João Costa shared 2 months ago
João Costa shared 2 months ago

Finally released the final version of Minart 0.6.0:

This version drops Scala 2 support and updates Scala Native to 0.5. The Minart Pure module was also removed.

This version has been in the oven for a while, so it includes a ton of bug fixes since 0.5.3.

Just released Minart 0.6.0-M3 with Scala Native 0.5.0 support.

This version might be (even) more unstable than usual, but I wanted to get it out ASAP to find as many bugs as possible before the proper 0.6.0 release.

Looks like Manning has some free books, courtesy of some sponsors at

I've read "Data Pipelines with Apache Airflow" and can definitely recommend it if you are into data engineering and want to learn more about Airflow data pipelines.

This weekend I was playing around with defining an animation DSL.

I've wanted to play this for a while after watching @davesmith00000's interview for "Scala for Fun & Profit" and @kubukoz Playdate talk. Everyone's doing DSLs for gamedev! 😄

It's still quite rough, but I think it's useful for things like menu animations. Maybe I'll use something like this in the next GameJam entry to add a bit more juice to the menus.

This example looks like this:

  val backgroundAnimation = {
    linear(0, 512, 10.0).loop
      .map(delta => (delta.toInt, delta.toInt))

  val baloonAnimation = {
    val rotation =
      (linear(-Math.PI / 32, Math.PI / 32, 1.0) >> linear(Math.PI / 32, -Math.PI / 32, 1.0)).rotate
    val beat =
      (easeOut(1.2, 0.9, 0.5) >> easeIn(0.9, 1.0, 0.1)).scaleXY

    (rotation && beat)

  val textAnimation = {
    val rotation =
      (easeIn(-Math.PI / 32, Math.PI / 32, 1.0) >> easeIn(Math.PI / 32, -Math.PI / 32, 1.0)).rotate
    val beat =
      (easeIn(1.3, 0.9, 0.5) >> easeIn(0.8, 1.0, 0.1)).scaleXY

    (rotation && beat)


All setup to go to Lambda Days 2024 in 2 months!

Due to the available flights, we'll go a few days earlier. Any recommendations for cool things to do/see/eat in Krakow?

On my previous job at Zalando I had multiple co-workers that kept a paper journal.

I tried to keep a digital journal in the past with VimWiki, but was quite unsuccessful at that. It's just too easy for me to paste random stuff there and make the journal a mess.

So, now that I changed jobs (and got a free notebook), I decided to give physical journaling a try.

I've been doing it for about a month and I'm enjoying it a lot. Just the simple act of checking "what I did yesterday" and writing "what I need to do today" (with no copy paste) really helps me focus.

On that note, since I started writing more, I decided to get a slightly better pen (I was using freebie pens). While I was in college I used a lot of Uni-ball Signo pens (usually either 0.5mm or 0.7mm), so I decided to try those again.

I forgot how smooth it feels to write with them, I need to get used to it, but it does feel nice 😅

João Costa shared 4 months ago

Playing around with flow fields again.

Turns out it's easier to have an image dissolving than to draw the flow field. The code for this effect was surprisingly small.

It's a shame that he video compression destroyed the effect, but I think it's good enough to imagine what it looks like.😅


I've been playing around with the new multithreading features of Scala Native 0.5.0-RC1.

I already checked that I can get my game jam entries working with a dedicated audio thread, so now I wanted to play with something different.

I picked up my gopher client and made it async (nothing special, just wrapped the calls in Future(blocking(...)) and it works like a charm.

My dumb green phosphorus skin was actually pretty helpful to see that it's working 😄 .

It's a bit hard to see on the video, but if you look closely you'll see that there's a scan effect sweeping the screen from the top to the bottom, and it keeps running even while the page is loading.

João Costa shared 4 months ago

I've been playing around with Scala Native 0.5.0-RC1 this weekend.

Originally I was hyped for the multithreading, but now I want that sweet compilation speed. Some of my projects are compiling in ~1/4 of a time on a full build.

This is going to make debugging performance issues so much better.

This was quite the Heisenbug:

Some sound files were corrupted, but only when loaded from the Java resources on a specific application. When I loaded them on unit tests or Scala CLI scripts they would work fine. Even something as simple as loading them from a file (instead of a Java resource) would work 😰 .

Turns out sometimes does not read all the bytes (duh, that's why it returns the number of bytes read) and I was not handling that... not sure how I didn't hit this earlier 😅 .