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 The new owners-maintainers of Dream Slipshow! Bancos: A persistent Key-Value store based on ROWEX/P-ART restricted 1.2.0 limit which system operations and which parts of the filesystem your program can access dead_code_analyzer 1.1.0 OCaml security team Proposal: make the minimum tested opam 2.1 and higher csexp-query initial release Other OCaml News Old CWN lwt-to-eio: Automating the mechanical parts of Lwt -> Eio migration ═══════════════════════════════════════════════════════════════════ Archive: 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] [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 ═══════════════════════════════════ Archive: 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 ( ), 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! [Dream] [issue tracker] [#webdev] [#dream] Slipshow! ═════════ Archive: 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: The tutorials also includes live code blocks, and Slipshow has now a [dedicated website]. Here is the full changelog! [documentation] [structuring your presentation visually] [dedicated website] 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! [supporting] Bancos: A persistent Key-Value store based on ROWEX/P-ART ═════════════════════════════════════════════════════════ Archive: 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: 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! [bancos] [ART] [ROWEX] [RECIPE/P-ART] [kevin] [blaze] [here] [Miou] [flux] [carton] [bstr] [cachet] [here] restricted 1.2.0 limit which system operations and which parts of the filesystem your program can access ════════════════════════════════════════════════════════════════════════════════════════════════════════ Archive: 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: • [opam] • [api] • [examples] • [git repo] • [License AGPL] 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) [restricted] [restricted] [pledge on Linux] [opam] [api] [examples] [git repo] [License AGPL] [Semantic Versioning] dead_code_analyzer 1.1.0 ════════════════════════ Archive: 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. [the release of the dead_code_analyzer 1.1.0] [user documentation] [work in progress to support OCaml 5.3] [report it on the github repository] OCaml security team ═══════════════════ Archive: 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 ═════════════════════════════════════════════════════ Archive: 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! [raising the minimum version of OCaml tested to 4.08] [opam 2.0.0 was released] [built every version] [repology/opam] csexp-query initial release ═══════════════════════════ Archive: 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! [opam package] [sexp] [csexp-query] [canonical s-expressions] Other OCaml News ════════════════ From the ocaml.org blog ─────────────────────── Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. • [Extending RPC capabilities in OCurrent] • [Email notifications come to Mollymawk] • [open Core] [the ocaml.org blog] [Extending RPC capabilities in OCurrent] [Email notifications come to Mollymawk] [open Core] 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]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt]