OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 20 to 27, 2026.

Table of Contents

lwt-to-eio: Automating the mechanical parts of Lwt -> Eio migration

oug-t announced

Hi everyone,

Like many of you, I’ve been looking into migrating my libraries from Lwt to Eio to take advantage of OCaml 5’s direct-style concurrency. While the manual migration guides are excellent, I found myself making the same mechanical changes over and over—flattening binds, unwrapping promises, and rewriting maps.

So, I built lwt-to-eio, a tool that automates the boring parts of this transition.

Repo: https://github.com/oug-t/lwt-to-eio

What it does (The Magic)

It parses your OCaml source code and performs AST-level rewrites to transform monadic Lwt patterns into direct-style Eio code.

Input (Lwt):

let fetch_data id =
  Lwt.bind (Db.get_user id) (fun user ->
    Db.get_posts user.id >>= (fun posts ->
      Lwt_list.map_p process posts
    )
  )

Output (Eio)

let fetch_data id =
  let user = Lwt_eio.Promise.await_lwt (Db.get_user id) in
  let posts = Lwt_eio.Promise.await_lwt (Db.get_posts user.id) in
  Eio.Fiber.List.map process posts

Current Status & Help Wanted

This is currently an MVP. It handles the most common patterns I encountered (binds, map_p, sleep, return), but there is plenty of surface area left to cover.

I'm looking for contributors to help add rules for other common patterns. I've tagged a few issues as "Good First Issues" if anyone wants to dip their toes into ppxlib and AST rewriting:

  • Lwt.catch -> try/with: Transforming monadic error handling to direct style exceptions.
  • Lwt_io support: Mapping legacy IO functions to Eio buffers.

Feedback, PRs, and "It broke on my file!" reports are all very welcome.

Happy hacking!

The new owners-maintainers of Dream

Anton Bachin announced

I am very pleased to announce that Dream, the Web framework, is now owned and maintained by a new team, of:

  • Sabine Schmaltz (@sabine), maintainer of OCaml.org
  • Sebastian Willenbrink ( https://github.com/Willenbrink ), author of the effort to port Dream to Eio
  • Yawar Amin (@yawaramin), author of dream-html, and the Web framework ReWeb

…among their other projects and contributions to the OCaml community. All are major and long-term contributors to, and users of, Dream.

I’ve stepped back from ownership and overall maintenance, but will still work on parts of Dream every now and then as a contributor, along with all of Dream’s contributors :slight_smile:

Dream is discussed in this forum, in its issue tracker, #webdev in the OCaml Discord, and #dream on Zulip. Dream has a (roughly) weekly open video call on Discord for contributors to discuss technical issues with each other and with maintainers.

Welcome to Sabine, Sebastian, Yawar, the new team!

Slipshow!

Paul-Elliot announced

Hello!

It is in a state of sliplessness that I announce the new release of Slipshow!

Slipshow 0.8.0: Les gnomes voleurs de Slipshow

This release comes with a handful of bugfixes, in particular on the new and experimental record-and-replay for drawings.

But the star of the release is the new documentation! For instance, the tutorial on structuring your presentation visually will allow you to create presentations such as this one, presenting Slipshow's business model:

https://github.com/user-attachments/assets/41539c78-f998-4597-9392-4d555435d5a3

The tutorials also includes live code blocks, and Slipshow has now a dedicated website.

Here is the full changelog!

Features

  • Add a "mirror mode" to the speaker view, which mirrors the entire screen you are sharing with the audience (#188)
  • Add support for external files through CLI and frontmatter (#191)
  • Add shortcut to delete or unselect selection in drawing editing (#192)
  • Add a "Close editing panel" button when there are no strokes (#192)
  • Default file names for drawing recording depend on their names (#192)
  • Improve -o argument wrt directories (#190)
  • Inline SVGs instead of adding them as images, allowing the use of classes and ids in SVGs (#190)
  • Rework the docs! (#190)

Fix

  • Fix pauses time not updated after a rerecording (#192)
  • Fix drawing editing shortcuts triggering even when focusing on a textarea (#192)
  • Fix interaction between fields and drawing editing shortcuts (#192)
  • Fix order of clear and draw action: the first comes first (#192)
  • Use .woff2 for embedded fonts (#190)

Thanks again to NLNet for supporting the development of Slipshow!

Bancos: A persistent Key-Value store based on ROWEX/P-ART

Calascibetta Romain announced

I am pleased to announce the first release of bancos, our new persistent Key-Value store.

Bancos is an implementation of an Adaptive Radix Tree (ART) modified to support parallel reads and writes (ROWEX) directly on a file (based on the RECIPE/P-ART approach).

  • Our project is designed for indexing with file-backed storage.
  • We provide an implementation compatible with unikernels. It is currently being used by kevin, an HTTP/1.1 server unikernel that exposes routes for key insertion and lookup.
  • This work is part of our broader goal to index emails by their Message-ID. An extension of our tool blaze now allows searching through archives now (if you are interesting about our archive system, you can take a look here). This indexing also enables efficient email thread extraction using In-Reply-To headers.

While still experimental, the results — especially when paired with our Miou scheduler — are very promising. This release of bancos comes alongside several updates across our stack:

  • flux: Our OCaml stream library for Miou
  • carton: For manipulating PACKv2 archives (as used by Git)
  • bstr: A library for handling bigbytes and memory buffers
  • cachet: A library to cache mmap syscall results. Notably, this include significant work on an asynchronous write pipeline for unikernels on block devices

You can find the project here: https://github.com/robur-coop/bancos

For a deeper dive into the implementation of bancos and its application to email indexing, we have prepared a detailed blog post here.

Happy hacking!

restricted 1.2.0 limit which system operations and which parts of the filesystem your program can access

removewingman announced

Hello,

I am happy to announce a new version of restricted.

This library lets you limit which system operations and which parts of the filesystem your program can access. Call it as early as possible in your program so that the rest of the code runs with reduced privileges. Currently, actual enforced restrictions are implemented for these operating systems:

  • OpenBSD
  • Linux (only filesystem view)

Even on other operating systems, you can still use restricted to document which privileges your program needs. Users can then test if your program respects these promises with tools such as pledge on Linux. Enjoy :slight_smile:

CHANGELOG:

  • add Linux (only filesystem view) via landlock(7)
    • except unlink/removing, whole other thing with LANDLOCK_ACCESS_FS_READ_FILE in landlock
  • add Semantic Versioning
  • change description to make it more clear
  • tested with flambda switch on:
    • x86_64-openbsd
    • x86_64-arch-linux, x86_64-alpine-linux (Landlock ABI version: 7)

dead_code_analyzer 1.1.0

fantazio announced

Hello everyone,

I am happy to announce the release of the dead_code_analyzer 1.1.0 (available via opam) !

Thanks to @edwinans, @nojb, and @Tibo for their contributions, reviews, and feedback.

This release greatly improves the support of projects built with dune and introduces some user documentation. The tool still requires OCaml 5.2. There is a work in progress to support OCaml 5.3.

If you encounter a problem with this release, please report it on the github repository. Feedback and contributions are welcome.

OCaml security team

Continuing this thread, Hannes Mehnert announced

Dear everyone, as we discussed in the earlier public meeting, we plan to have every 3 months another one.

The next public security meeting is scheduled for Thursday, March 19th 14:00 CET - 16:00 CET. Please put that into your calendar if you plan to attend.

Proposal: make the minimum tested opam 2.1 and higher

Anil Madhavapeddy announced

Much as we did a while back with raising the minimum version of OCaml tested to 4.08, it's now time to raise the minimum version of opam that we test in the CI matrix.

opam 2.0.0 was released in 2018, and ever since then the Docker images have built every version, with the default being the minimum version (2.0.x) all the way through to 2.5.x.

I now propose that we raise the minimum tested version of opam to 2.1.x. Looking in repology/opam, the only notable distro still shipping opam 2.0 is Ubuntu 20.04, which went EOL in May 2025. Ubuntu 24.04 still has have 2.1.x, so I expect this will be the testing floor for some years until that rotates out.

The most observable improvement from this will be the opam-repository CI 'The actions to process have cyclic dependencies' failure will no longer bug us for every package submitted that has {with-test} clauses!

csexp-query initial release

Josh Berdine announced

The csexp-query 0.1.0 opam package is now available.

If you have ever wanted to query e.g. the output of dune describe (but didn't want the dependency cone of sexp), then csexp-query might be interesting.

csexp-query is a minimal command-line tool to query canonical s-expressions (csexp) from stdin. For example,

dune describe workspace --format=csexp | csexp-query '(field root)'

will extract the dune project root.

Happy hacking!

Other OCaml News

From the ocaml.org blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe to the caml-list.