[Caml-list] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt
2026-01-27T12:42:06Z

[-- Attachment #1: Type: text/plain, Size: 18672 bytes --]

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:
<https://discuss.ocaml.org/t/ann-lwt-to-eio-automating-the-mechanical-parts-of-lwt-eio-migration/17696/1>

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]
<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:
<https://discuss.ocaml.org/t/the-new-owners-maintainers-of-dream/17712/1>

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!

[Dream] <https://github.com/camlworks/dream>

[issue tracker] <https://github.com/camlworks/dream/issues>

[#webdev]
<https://discord.com/channels/436568060288172042/439062744105484288>

[#dream] <https://ocaml.zulipchat.com/#narrow/channel/556063-dream>

Slipshow!
═════════

Archive: <https://discuss.ocaml.org/t/ann-slipshow/16337/17>

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!

[documentation] <https://slipshow.readthedocs.io/en/stable/>

[structuring your presentation visually]
<https://slipshow.readthedocs.io/en/stable/visual-structure.html>

[dedicated website] <https://slipshow.org>

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] <https://nlnet.nl/project/Slipshow/>

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

Archive:
<https://discuss.ocaml.org/t/ann-bancos-a-persistent-key-value-store-based-on-rowex-p-art/17719/1>

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!

[bancos] <https://github.com/robur-coop/bancos>

[ART] <https://github.com/dinosaure/art>

[ROWEX] <https://db.in.tum.de/~leis/papers/artsync.pdf>

[RECIPE/P-ART] <https://arxiv.org/pdf/1909.13670>

[kevin] <https://github.com/robur-coop/kevin>

[blaze] <https://github.com/dinosaure/blaze>

[here]
<https://blog.robur.coop/articles/2025-01-07-carton-and-cachet.html>

[Miou] <https://github.com/robur-coop/miou>

[flux] <https://github.com/robur-coop/flux>

[carton] <https://github.com/robur-coop/carton>

[bstr] <https://github.com/robur-coop/bstr>

[cachet] <https://github.com/robur-coop/cachet>

[here] <https://blog.robur.coop/articles/2025-18-12-bancos.html>

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

Archive:
<https://discuss.ocaml.org/t/ann-restricted-1-2-0-limit-which-system-operations-and-which-parts-of-the-filesystem-your-program-can-access/17732/1>

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]
<https://opam.ocaml.org/packages/restricted/restricted.1.2.0/>

[restricted] <https://removewingman.codeberg.page/restricted/>

[pledge on Linux] <https://justine.lol/pledge/>

[opam] <https://opam.ocaml.org/packages/restricted/restricted.1.2.0/>

[api] <https://removewingman.codeberg.page/restricted/>

[examples]
<https://codeberg.org/removewingman/restricted/src/branch/main#usage-and-examples>

[git repo] <https://codeberg.org/removewingman/restricted>

[License AGPL]
<https://en.wikipedia.org/wiki/GNU_Affero_General_Public_License>

[Semantic Versioning] <https://semver.org/>

dead_code_analyzer 1.1.0
════════════════════════

Archive:
<https://discuss.ocaml.org/t/ann-dead-code-analyzer-1-1-0/17734/1>

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]
<https://github.com/LexiFi/dead_code_analyzer/releases/tag/1.1.0>

[user documentation]
<https://github.com/LexiFi/dead_code_analyzer/blob/1.1.0/docs/USER_DOC.md>

[work in progress to support OCaml 5.3]
<https://github.com/LexiFi/dead_code_analyzer/pull/38>

[report it on the github repository]
<https://github.com/LexiFi/dead_code_analyzer/issues>

OCaml security team
═══════════════════

Archive:
<https://discuss.ocaml.org/t/ann-ocaml-security-team/16902/11>

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:
<https://discuss.ocaml.org/t/proposal-make-the-minimum-tested-opam-2-1-and-higher/17736/1>

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]
<https://discuss.ocaml.org/t/raising-the-minimum-tested-version-of-ocaml-to-4-05-or-4-08-from-4-02/12464>

[opam 2.0.0 was released]
<https://discuss.ocaml.org/t/ann-opam-2-0-0-final-release-and-repository-upgrade/2585>

[built every version]
<https://github.com/ocurrent/ocaml-dockerfile/blob/master/src-opam/opam.mli#L44-L52>

[repology/opam] <https://repology.org/project/opam/versions>

csexp-query initial release
═══════════════════════════

Archive:
<https://discuss.ocaml.org/t/ann-csexp-query-initial-release/17737/1>

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] <https://opam.ocaml.org/packages/csexp-query/>

[sexp] <https://github.com/janestreet/sexp>

[csexp-query] <https://github.com/jberdine/csexp-query>

[canonical s-expressions]
<https://en.wikipedia.org/wiki/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] <https://ocaml.org/blog/>

[Extending RPC capabilities in OCurrent]
<https://www.tunbury.org/2026/01/26/ocurrent-rpc/>

[Email notifications come to Mollymawk]
<https://blog.robur.coop/articles/mollymawk-email-notifs.html>

[open Core]
<https://www.dra27.uk/blog/platform/2026/01/19/plotting-a-new-course.html>

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] <mailto:alan.schmitt@polytechnique.org>

[the archive] <https://alan.petitepomme.net/cwn/>

[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>

[caml-list] <https://sympa.inria.fr/sympa/info/caml-list>

[Alan Schmitt] <https://alan.petitepomme.net/>

[-- Attachment #2: Type: text/html, Size: 31606 bytes --]