Sign in

Thomas Letan

@lthms.soap.coffee
152 followers 109 following 400 posts

“Decent solutions provider.” He/him. soap.coffee/~lthms

PostsRepliesMedia
Thomas Letan @lthms.soap.coffee · 27/03/2026
so sad
A screenshot of my terminal with infamous overloaded error, 9/10 attempts.
010
Thomas Letan @lthms.soap.coffee · 23/02/2026
What can go wrong?
A screenshot with a section heading: “Why Kubernetes?”
000
Thomas Letan @lthms.soap.coffee · 21/02/2026
My favorite time of a hobby project.
A screenshot of my next article draft, titled “I Built Myself a Managed Cluster”.
100
Thomas Letan @lthms.soap.coffee · 27/01/2026
I’ve spent ~1 week experimenting with CeCe without writing a single instruction (letting Claude doing it for me). Now trying to get everything I learned and write the prompts myself ahah.
A claude caude discussion

❯ /vee:contradictor
● 😈 Contradictor mode activated. Go ahead, say something — I dare you to convince me.
❯ /vee:normal
● 😈 Oh, running back to normal mode already? Couldn't handle a little pushback? 😏
  🦊 Back to normal mode. How can I help?
010
Thomas Letan @lthms.soap.coffee · 25/01/2026
2026 Q1 challenge: publish enough articles that my website homepage does not mention 2024 anymore
A cropped screenshot of my homepage showing several articles from 2024 as my “most recent publications”
000
Thomas Letan @lthms.soap.coffee · 24/01/2026
💪
A screenshot of an empty article about “How I want to use LLMs in 2026”
110
Thomas Letan @lthms.soap.coffee · 21/01/2026
I’m starting to have fun with making Claude work as transparently as possible.
A screenshot of Claude Code showing the agent checking its work against lite user stories. Each user stories is mapped to one or more changes it has introduced.A screenshot of a GitHub issues showing a bot posting the issue, then a design, that can be read and understood by a human
000
Thomas Letan @lthms.soap.coffee · 09/01/2026
The hype was real 😆
A graph showing my latest article has been seen a bit today, 622 visits exactly.
000
Thomas Letan @lthms.soap.coffee · 06/01/2026
A rendering of the previous log in Honeycomb.io
000
Thomas Letan @lthms.soap.coffee · 06/01/2026
Looking good.
A preview of an #OCaml library i’m building to get OpenTelemetry-first structured logging (among other things)
200
Thomas Letan @lthms.soap.coffee · 31/05/2025
eio-trace is really cool
010
Thomas Letan @lthms.soap.coffee · 31/05/2025
Trying to perform another request before releasing the first switch will open a second connections, as expected
000
Thomas Letan @lthms.soap.coffee · 31/05/2025
Okay, eio-trace is pretty awesome
A screenshot of eio-trace output; it shows exactly what happens. In practice, it's a good way to demonstrate the connection is reused (only one `connect`).
100
Thomas Letan @lthms.soap.coffee · 11/01/2025
Even nicer with a better unicode character
140
Thomas Letan @lthms.soap.coffee · 11/01/2025
At $WORK, our logging library does not show the level (warning, debug, etc.) of a given log. Or… doesn’t it? 👀
The “before” snapshot. No indication of log level.The after screenshot. The log levels are clearly displayed (in caps even).
340
Thomas Letan @lthms.soap.coffee · 07/01/2025
The OCaml Planet effect is real! 👀
161
Thomas Letan @lthms.soap.coffee · 01/01/2025
Work in progress
240
Thomas Letan @lthms.soap.coffee · 31/12/2024
I still need to understand _why_.
010
Thomas Letan @lthms.soap.coffee · 30/12/2024
Okay, will I stick to this marvel or not?
A screenshot of two cool-retro-term instance, one with neovim started, the other with just the output of `ls`.
It’s cool and retro, but a little flashy tbh.
000
Thomas Letan @lthms.soap.coffee · 22/12/2024
Work in progress.
A brown colorless theme for Neovim, where only the comments have an emphasis color. There are some unwanted colors like in the autocompletion windows. This will go away eventually.
020
Thomas Letan @lthms.soap.coffee · 15/12/2024
In-memory compression using camlzip and Unix pipes. One had to think about blocking writes 😂

let gzip content =
  let inc, ouc = Unix.pipe () in
  let ouc = Gzip.open_out_chan Unix.(out_channel_of_descr ouc) in
  let _writer =
    Domain.spawn (fun () ->
        Gzip.output_substring ouc content 0 String.(length content);
        Gzip.close_out ouc)
  in
  let res = In_channel.input_all Unix.(in_channel_of_descr inc) in
  Unix.close inc;
  res
100
Thomas Letan @lthms.soap.coffee · 01/12/2024
I might participate to the Advent of Code for the first time this year. Gave a late try to the first day, and it was a nice opportunity to mess with the Seq module from the OCaml standard library. Seq.memoize to make sure we only read our input file once.
module Inputs = struct
  let rec from_channel_ephemeral inc : (int * int) Seq.t =
   fun () ->
    match In_channel.input_line inc with
    | Some line -> (
        match String.split_on_char ',' line with
        | [ left; right ] ->
            Seq.Cons
              ( (int_of_string left, int_of_string right),
                from_channel_ephemeral inc )
        | _ -> assert false)
    | None -> Seq.Nil

  let from_channel inc =
    inc |> from_channel_ephemeral |> Seq.memoize |> Seq.unzip
end
130
Thomas Letan @lthms.soap.coffee · 10/07/2023
Fractals War!
Five fractals have fought to claim and keep pixels in a black canvas.
020
Thomas Letan @lthms.soap.coffee · 25/06/2023
Tried a new style for the links of my website 👀
000