Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 17 Feb 2026 14:47:16 +0100
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Hello
Here is the latest OCaml Weekly News, for the week of February 10 to 17,
2026.
Table of Contents
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80
trace 0.11
Bogue, the OCaml GUI
OCaml examples of computing with encrypted or private data
CMake, Ninja and Google or-tools packages
Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers
YOCaml, a framework for static site generator
Other OCaml News
Old CWN
trace 0.11
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90
Archive: <https://discuss.ocaml.org/t/ann-trace-0-11/17796/1>
Simon Cruanes announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Dear all, I'm delighted to announce the release of [trace 0.11]. This
is a major release and hopefully the last one before 1.0.
[trace] is a lightweight foundation for instrumentation, a bit like
[rust's tracing]. It provides a _protocol_ between, one the one hand,
libraries and applications that are instrumented; and a _collector_
that decides what to do with that. My hope is that projects
(especially libraries) can adopt `trace' without fear because of the
tiny footprint and high flexibility, the same way `logs' is used in
many places. Existing collectors can produce [chrome format traces],
fuchsia traces, plug into [tracy], or into [opentelemetry]; a bridge
to `Runtime_events' is planned[^1].
[^1]: trace is more flexible than `Runtime_events' and works on OCaml
4, but of course it should be possible to have both interoperate!
[API docs for the main library]
[trace 0.11]
<https://github.com/ocaml-tracing/ocaml-trace/releases/tag/v0.11>
[trace] <https://github.com/ocaml-tracing/ocaml-trace/>
[rust's tracing] <https://github.com/tokio-rs/tracing>
[chrome format traces]
<https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKch=
NAySU/edit>
[tracy] <https://github.com/ocaml-tracing/ocaml-tracy>
[opentelemetry] <https://github.com/ocaml-tracing/ocaml-opentelemetry>
[API docs for the main library]
<https://ocaml-tracing.github.io/ocaml-trace/trace/Trace_core/index.html>
brief example
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C
A simple example program from the readme:
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 let (let@) =3D (@@)
=E2=94=82=20
=E2=94=82 let run () =3D
=E2=94=82 Trace.set_process_name "main";
=E2=94=82 Trace.set_thread_name "t1";
=E2=94=82=20
=E2=94=82 let n =3D ref 0 in
=E2=94=82=20
=E2=94=82 for _i =3D 1 to 50 do
=E2=94=82 let@ _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "outer.loo=
p" in
=E2=94=82 for _j =3D 2 to 5 do
=E2=94=82 incr n;
=E2=94=82 let _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "inner.lo=
op" in
=E2=94=82 Trace.messagef (fun k -> k "hello %d %d" _i _j);
=E2=94=82 Trace.message "world";
=E2=94=82 Trace.counter_int "n" !n;
=E2=94=82 done
=E2=94=82 done
=E2=94=82=20
=E2=94=82 let () =3D
=E2=94=82 (* here we setup the collector *)
=E2=94=82 let@ () =3D Trace_tef.with_setup ~out:(`File "trace.json") ()=
in
=E2=94=82 run ()
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
If we run the program with `TRACE=3D1' to enable this particular
collector, we get a trace file in `trace.json' (but with actual
timestamps):
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 [{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"=
}},
=E2=94=82 {"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name"=
:"t1"}},
=E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"=
I"},
=E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"},
=E2=94=82 {"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}},
=E2=94=82 =E2=80=A6
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Opening it in <https://ui.perfetto.dev> we get something like this:
[screenshot of perfetto UI]
[screenshot of perfetto UI]
<https://github.com/ocaml-tracing/ocaml-trace/blob/main/media/ui.png?raw=3D=
true>
what's new in 0.11
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C
0.11 contains major changes, almost all of which are breaking _on the
collector side_. Instrumented programs should be **mostly**
unaffected, aside from many deprecation warnings.
The core change is that `Trace.span' is [now] an **open sum type**,
and not `int64'. This means less global state and fewer tables needed:
collectors can pick exactly what data gets carried from the
`enter_span' site into the `exit_span' site, if any. In turns,
collectors get simpler and faster. The notion of "manual" span is now
dead (a simple alias to normal spans) and all related functions are
deprecated. 1.0 will not have this notion at all.
In addition, collectors are now [a bag of callbacks+a state], rather
than a first class module. `trace.subscriber' has been removed because
the notion of subscriber is subsumed by the notion of collector (now
more easily composable). The TEF and fuchsia collectors are now
simpler and free of global state.
`user_data' is now a polymorphic variant to, for better ease of
use. Metrics are an open sum type, and the previous `int' and `float'
cases are just provided as constructors of this type. Dependencies on
`thread-local-storage' and `hmap' are now entirely gone.
[now]
<https://ocaml-tracing.github.io/ocaml-trace/trace/Trace_core/index.html#ty=
pe-span>
[a bag of callbacks+a state]
<https://ocaml-tracing.github.io/ocaml-trace/trace/Trace_core/Collector/ind=
ex.html>
organization note
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C
Note: the project has moved from my gh account (c-cube) to a dedicated
organization [ocaml-tracing] for telemetry and tracing projects. Other
projects such as [opentelemetry] have also migrated there.
[ocaml-tracing] <https://github.com/ocaml-tracing/>
[opentelemetry] <https://github.com/ocaml-tracing/ocaml-opentelemetry>
Bogue, the OCaml GUI
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90
Archive: <https://discuss.ocaml.org/t/ann-bogue-the-ocaml-gui/9099/65>
Continuing this thread, sanette announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hi
I'm happy to announce [Bogue] version 20260208, now available on opam.
The main novelties are
=E2=81=83 Color management has been improved (_warning: breaking change_)
=E2=81=83 New: *Text input validator* : you can write rules (or simply a
regexp) to warn the user whether the text they are typing is
correct.
=E2=81=83 New: *Mailbox* module: setup a mailbox server and send arbitrary
messages between widgets.
=E2=81=83 Installation on Windows has been simplified.
=E2=81=83 Compatibility with old versions of SDL.
Have fun!
Here are the details:
=E2=81=83 /Colors/: All colors and some of the API have been split into t=
he
`RGB' and `RGBA' modules. Named colors are now true identifiers:
=E2=81=83 instead of writing `let c =3D Draw.find_color "aliceblue' you=
should
now use `let c =3D RGB.aliceblue'; and instead of `let c =3D
Draw.(opaque (find_color "aliceblue"))' you write now `let c =3D
RGBA.aliceblue'.
=E2=81=83 if you're lazy to correct these, you may simply do `open Bogu=
e.RGB
open Bogue.RGBA'; it should be enough in most cases.
=E2=81=83 /Text input validator/: Example using the included *email
validator*:
<https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/c/c57c=
d7fef6d0c6726b3fde63bab8052a1a91012f.webp>
=E2=81=83 /Mailbox API/: for complicated GUIs with circular connnections
between widgets, the usual Bogue solution was to use an `update'
event, see [here]. Now this method has been leveraged to a full
Mailbox system where any type of message can be sent.
=E2=81=83 /Windows/ users should follow the instructions [here]. Continuo=
us
testing (CI) is now guaranteed to work on Windows mingw64 (and of
course Linux and MacOS)
=E2=81=83 /SDL/: if you have an old version of SDL (>=3D 2.0.6) and are t=
oo lazy
to upgrade, rejoice: simply follow the instructions [here]
[Bogue] <https://github.com/sanette/bogue>
[here]
<https://sanette.github.io/bogue-tutorials/bogue-tutorials/modif_parent.htm=
l#method-2:-use-update-events-to-get-rid-of-recursivity!>
[here] <https://github.com/sanette/bogue#installing-on-windows>
[here] <https://github.com/sanette/bogue#sdl2-troubleshooting>
OCaml examples of computing with encrypted or private data
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-ocaml-examples-of-computing-with-encrypt=
ed-or-private-data/17799/1>
Xavier Leroy announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Last Fall, I gave a [series of lectures] on secure computing
(computing with encrypted or private data).
Here is some companion OCaml code that demonstrates these techniques:
<https://github.com/xavierleroy/secure-computing> .
If you're curious about homomorphic encryption, zero-knowledge proofs,
secure multi-party computation, oblivious transfers, private set
intersection and so on, you might enjoy these code examples and the
explanations given in the lectures.
This code is probably insecure and not intended to be used in actual
high-security applications. If you're into this kind of things, see
[Belenios], an excellent e-voting system written in OCaml that uses
many of these secure computing techniques.
[series of lectures]
<https://xavierleroy.org/CdF/2025-2026/en/index.html>
[Belenios] <https://www.belenios.org/>
CMake, Ninja and Google or-tools packages
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-dk0-cmake-ninja-and-google-or-tools-pack=
ages/17805/1>
jbeckford announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80
It is my pleasure to announce the following packages for
(<https://discuss.ocaml.org/t/ann-the-dk0-build-system/17709>):
=E2=80=A2 [`[email protected]'] and
[`[email protected]']: CMake and Ninja. The C
compiler, Ninja and CMake are the basic tools used to build the
majority of modern C projects.
=E2=80=A2 [`[email protected]'] and
[`[email protected]']: Google's `or-tools'
libraries discussed by @tbrk in a couple threads last week
(<https://discuss.ocaml.org/t/dune-cmake-and-j/17768/6?u=3Djbeckford>
and
<https://discuss.ocaml.org/t/foreign-archives-no-static-libraries-dylib=
-on-mac/17669/10?u=3Djbeckford>)
These packages are my /start/ to a clean replacement for opam
`depexts'. `depexts' does not work well for me: basic engineering
(reproducibility) is gone, system packages often are too far behind
their upstream versions, the complete unavailability for Windows
users, the occasional symlink break with homebrew, etc.
Here's the basic idea (macOS only for now):
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 # There are other ways to install dk0 but for now use this
=E2=94=82 $ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc
=E2=94=82=20
=E2=94=82 # Then invoke a fully-qualified target to build `or-tools`
=E2=94=82 # which will quickly download precompiled artifacts
=E2=94=82 $ dksrc/dk0 --trial get-object [email protected]=
.0 \
=E2=94=82 -s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/
=E2=94=82=20
=E2=94=82 # See what is there
=E2=94=82 $ tree target/ocaml-ortools-arm64 --filelimit 5
=E2=94=82 target/ocaml-ortools-arm64
=E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 include [33 entries exceeds fileli=
mit, not opening dir]
=E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 shared
=E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [262 entries excee=
ds filelimit, not opening dir]
=E2=94=82 =E2=94=94=E2=94=80=E2=94=80 static
=E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [131 entries exceeds filel=
imit, not opening dir]
=E2=94=82 # ...
=E2=94=82 $ du -sh target/ocaml-ortools-arm64
=E2=94=82 464M target/ocaml-ortools-arm64
=E2=94=82 # ...
=E2=94=82 $ find target/ocaml-ortools-arm64 -name 'libortools*'
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.=
so
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.so
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.so
=E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so
=E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools.a
=E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
/`or-tools' is just a proof of concept to test my CMake
package. I know little about `or-tools'! I just picked it
because it was the C library being discussed last week./
Calling a build target looks at first like installing a package:
=E2=80=A2 you get a 125MB compressed download of precompiled `or-tools'
libraries. In this case those libraries have been packaged to follow
OCaml conventions (both static and shared libraries are present, and
`.so' extensions instead of `.dylib' on macOS) =E2=80=A6 the same thing=
you
expect when you use depexts.
But `dk0' is a build tool. So if you change to a set of parameters
that has not been precompiled like so:
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 rm t/d/val.1/j* # hack for bug https://github.com/diskuv/dk/iss=
ues/98
=E2=94=82=20
=E2=94=82 dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial \
=E2=94=82 get-object [email protected] \=20
=E2=94=82 -s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
the build will happen locally (~1 hour on an M1).
This style of build system may be unfamiliar. So my analogies would
be:
=E2=80=A2 a `nix' binary cache with overlays (I haven't personally used
`nix'); JSON and Lua serve the same purpose as the Nix language, or
=E2=80=A2 an Internet-accessible dune cache that everybody can use; JSON =
and
Lua serve the same purpose as dune files and dune `(rule ...)'
expressions.
The CMake package limitations as of 2026-02-12 =E2=80=A6 but scroll down =
in
this thread to see if I have posted an update:
=E2=80=A2 I haven't had the time to complete dk0 packages for C compilers=
, so
the CMake package is incomplete. CMake + Ninja discovers C compilers
on macOS trivially, and last week's threads were discussing macOS,
so I prioritized macOS with xcode.
=E2=80=A2 I tested the CMake package on Apple Silicon. Windows is partial=
ly
tested but don't use Windows yet.
=E2=80=A2 There is no integration with opam or dune yet.
Thanks!
=E2=80=94
[`[email protected]']
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_Build/CMake0.v=
alues.lua>
[`[email protected]']
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_Build/Ninja0.v=
alues.jsonc>
[`[email protected]']
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_OR/Tools.valu=
es.lua>
[`[email protected]']
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotInriaParkas_Caml/ORTool=
s.values.jsonc>
Building your own packages
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=
=E2=95=8C
/This is bonus material for those thinking about building
dk0 packages/
The JSON build file for `[email protected]' is
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotInriaParkas_Caml/ORTo=
ols.values.jsonc>
`[email protected]' uses the C library package
`[email protected]'. Its Lua build file is
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_OR/Tools.va=
lues.lua>.
And `[email protected]' uses the tool package
`[email protected]'. You can use a command line
variation of it (`[email protected]') without any
JSON or Lua build files =E2=80=A6 here is an example:
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 dksrc/dk0 --trial run [email protected] ins=
talldir=3Di/llama-cpp \
=E2=94=82 > 'mirrors[]=3Dhttps://github.com/ggml-org/llama.cpp/archiv=
e/refs/tags' \
=E2=94=82 > 'urlpath=3Db7974.zip#be9d624603e39cd4edee5fa85e8812eb8e13=
93537c8e4e4629bc4bd016388053,29881192' \
=E2=94=82 > 'nstrip=3D1' 'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF' \
=E2=94=82 > 'exe[]=3Dbin/*' \
=E2=94=82 > 'out[]=3Dbin/llama-quantize' \
=E2=94=82 > 'outrmglob[]=3Dtest-*' 'outrmglob[]=3D*.py' \
=E2=94=82 > 'outrmglob[]=3Dllama-[a-p]*' 'outrmglob[]=3Dllama-[r-z]*'=
\
=E2=94=82 > 'outrmexact[]=3Dinclude' 'outrmexact[]=3Dlib'
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
With that single command, `[email protected]' will
download the popular C package `llama.cpp', build a static library,
remove several of its artifacts, and install what remains (especially
bin/llama-quantize) into the `i/llama-cpp' directory. Then type
`i/llama-cpp/bin/llama-quantize --help' to run what you just built.
If you want to make your own CMake-based package for OCaml, work
backwards from that explanation:
1. use the command line first to build a CMake project. It will do the
download, and run the `cmake -G', `cmake --build', `cmake
--install' on your behalf. The `dk0' error messages usually print
with helpful recommendations, and look at the top of
[`[email protected]'] for documentation.
2. then make a Lua build file to package it for C. You'll make a Lua
function ("rule") to set the command line arguments (what you
tested in the last step). At minimum, you need your Lua rule to say
how to get static vs shared libraries (you need both), and what
CMake flags to use for what platforms.
3. then make a JSON build file to package it for OCaml. Again, rely on
the `dk0' error messages.
4. then make a GitHub Actions job to distribute it. Here is the GitHub
Actions job for one of today's announced packages:
<https://github.com/diskuv/dk/blob/7b19425969be61bed0f1d6bf3015dac26d7=
966e1/.github/workflows/distribute-2.5.yml#L282-L364>. On
success, GitHub Actions will print the import commands you can run
so all the precompiled artifacts are available on your desktop.
[`[email protected]']
<https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_Build/CMake0.v=
alues.lua>
Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/neocaml-mode-a-modern-emacs-major-mode-for-o=
caml-is-looking-for-testers/17807/1>
Bozhidar Batsov announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hey everyone,
Just wanted to let you know I=E2=80=99ve spent a bit of time polishing
[neocaml] and I think now it=E2=80=99s ready to be used (or at least test=
ed)
by more people. The font-locking and indentation are more or less
done, and there=E2=80=99s also a basic integration with OCaml
toplevels. Coupled with something like `ocaml-eglot' the existing
functionality should get you pretty far.
You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80=
=99ll find
detailed instructions there), but I=E2=80=99ve also opened a MELPA recipe=
PR,
so I hope the installation process will become simpler soon.
Feel free to share feedback and feature requests here and over at
GitHub!
P.S. I know the name is a bit controversial (some people said it
evokes nvim vibes), and the down the road I may just rename it to
ocaml-mode or try to merge it with Tuareg. Naming remains hard=E2=80=A6
[neocaml] <https://github.com/bbatsov/neocaml>
Bozhidar Batsov later added
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80
A couple of small updates:
=E2=80=A2 Neocaml is now on MELPA <https://melpa.org/#/neocaml>
=E2=80=A2 I wrote a short blog post about the first =E2=80=9Cofficial=E2=
=80=9D release
<https://batsov.com/articles/2026/02/14/neocaml-0-1-ready-for-action/>
YOCaml, a framework for static site generator
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-yocaml-a-framework-for-static-site-gener=
ator/15393/12>
Continuing this thread, Xavier Van de Woestyne announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
*[ANN] YOCaml 3.0.0*
It had been a while since we announced a release of YOCaml
(since `2.5.0'), but this weekend we released version
`3.0.0' (already available on OPAM)!
Since version `2.5.0', many changes have been made to YOCaml, which
you can read about in the release notes for the various versions
released over the months: ([`2.6.0'], [`2.7.0'], [`2.8.0']).
Some major innovations that can be noted are:
=E2=80=A2 YOCaml finally deletes files that it did not create, which allo=
ws
for intermediate build steps that construct finer caches (making it
possible, for example, to create [backlinks] or [transclusions])
([yocaml#108])
=E2=80=A2 As mentioned by @benfaerber, adding `yocaml_liquid' as an
alternative template engine. ([yocaml#101])
=E2=80=A2 Major improvements to the validation/projection language (and
greater rigour in the concept of validation/normalisation)
([yocaml#98], [yocaml#109], [yocaml#115])
=E2=80=A2 Greater control over the iteration logic of actions, allowing
recursive traversal of file system fragments, among other things
([yocaml#111]).
=E2=80=A2 _Last but not least_, in this poorly named PR, [yocaml#120], we
added the possibility for a task to create multiple files and
replaced the internal representation of time. Previously, we used
integers, but now we have switched to floats, which offer greater
precision (and allow CI to correctly execute CRAM tests that
generate sites).
In addition, there are bug fixes, usability improvements, and=E2=80=A6 **a
drastic improvement in error reporting**, which I will explain in the
next section!
[`2.6.0'] <https://github.com/xhtmlboi/yocaml/releases/tag/v2.6.0>
[`2.7.0'] <https://github.com/xhtmlboi/yocaml/releases/tag/v2.7.0>
[`2.8.0'] <https://github.com/xhtmlboi/yocaml/releases/tag/v2.8.0>
[backlinks] <https://en.wikipedia.org/wiki/Backlink>
[transclusions] <https://en.wikipedia.org/wiki/Transclusion>
[yocaml#108] <https://github.com/xhtmlboi/yocaml/pull/108>
[yocaml#101] <https://github.com/xhtmlboi/yocaml/pull/101>
[yocaml#98] <https://github.com/xhtmlboi/yocaml/pull/98>
[yocaml#109] <https://github.com/xhtmlboi/yocaml/pull/109>
[yocaml#115] <https://github.com/xhtmlboi/yocaml/pull/115>
[yocaml#111] <https://github.com/xhtmlboi/yocaml/pull/111>
[yocaml#120] <https://github.com/xhtmlboi/yocaml/pull/120>
About the Outreachy
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C
Many of the improvements to YOCaml were made possible thanks to
various participants in the [Outreachy programme], which led to
@Linda_Njau being selected as an intern! His work is divided into two
specific areas:
=E2=80=A2 Drastically improve YOCaml error reporting : [yocaml#113],
[yocaml#114], [yocaml#116]. Before these patches, YOCaml errors were
extremely difficult to diagnose. Since @Linda_Njau took care of
them, they are now easier to read, provide context (which file
failed to create, and which file was being read), and are displayed
in the preview server, so you don't have to go and read the
terminal!
=E2=80=A2 The second part of his internship involves working on
[yocaml-codex], a project currently under development that aims to
provide a standard library of templates for building websites faster
with YOCaml and sharing the various templates that have been written
over the course of the websites developed with YOCaml. _Stay tuned_!
We are very satisfied (and impressed) with her work, and she has
documented her contributions in a blog=E2=80=A6 freshly designed, with YO=
Caml,
of course:
<https://engineering-yocaml-with-linda.netlify.app/articles/second_articl=
e>
[Outreachy programme] <https://www.outreachy.org/>
[yocaml#113] <https://github.com/xhtmlboi/yocaml/pull/113>
[yocaml#114] <https://github.com/xhtmlboi/yocaml/pull/114>
[yocaml#116] <https://github.com/xhtmlboi/yocaml/pull/116>
[yocaml-codex] <https://github.com/yocaml/yocaml-codex>
About the tutorial
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C
The tutorial is progressing slowly but surely, and we have notably
added a section that describes how to validate/project data to work
with most description languages (such as Yaml, ToML, etc.) and most
template engines (Jingoo, Mustache, Liquid) : [Your Own Data Model]
We also took the opportunity to clarify the [use of file paths] and
document [the resolver technique]!
We will continue to write sections and document the use of YOCaml, so
if you have any suggestions, comments, or requests, please send them
to us!
[Your Own Data Model]
<https://yocaml.github.io/tutorial/metadata-intro.html>
[use of file paths] <https://yocaml.github.io/tutorial/path.html>
[the resolver technique]
<https://yocaml.github.io/tutorial/path-resolver.html>
Closing words
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C
In September last year, I gave a very clumsy (_so French_)
[presentation of YOCaml at Fun OCaml] which presents YOCaml's design
choices!
YOCaml is becoming increasingly usable thanks to the [contributions of
many people]! Thank you. If you want to create a static blog/website
in OCaml, YOCaml is one of many fun options!
=E2=80=A2 [Repository]
=E2=80=A2 [Release note]
=E2=80=A2 [Packages]
=F0=9F=90=AB _Happy hacking and blogging_ =F0=9F=90=AB
[presentation of YOCaml at Fun OCaml]
<https://watch.ocaml.org/w/uSaQB8ejXBUdJGgUBfHCW8>
[contributions of many people]
<https://github.com/xhtmlboi/yocaml/graphs/contributors>
[Repository] <https://github.com/xhtmlboi/yocaml>
[Release note] <https://github.com/xhtmlboi/yocaml/releases/tag/v3.0.0>
[Packages] <https://ocaml.org/packages/search?q=3Dyocaml>
Other OCaml News
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
>From the ocaml.org blog
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Here are links from many OCaml blogs aggregated at [the ocaml.org
blog].
=E2=80=A2 [Day10: opam package testing tool]
=E2=80=A2 [Tessera pipeline in OCaml]
=E2=80=A2 [.plan-26-07: Storage, Lego, Echo, and the IUCN]
=E2=80=A2 [Neocaml 0.1: Ready for Action]
=E2=80=A2 [The 15-Game]
=E2=80=A2 [Optimizing an MP3 Codec with OCaml/OxCaml]
=E2=80=A2 [Announcing New Wasm_of_ocaml Optimisations]
[the ocaml.org blog] <https://ocaml.org/blog/>
[Day10: opam package testing tool]
<https://www.tunbury.org/2026/02/16/day10/>
[Tessera pipeline in OCaml]
<https://www.tunbury.org/2026/02/15/ocaml-tessera/>
[.plan-26-07: Storage, Lego, Echo, and the IUCN]
<https://anil.recoil.org/notes/2026w7>
[Neocaml 0.1: Ready for Action]
<https://batsov.com/articles/2026/02/14/neocaml-0-1-ready-for-action/>
[The 15-Game] <https://www.tunbury.org/2026/02/11/fifteen/>
[Optimizing an MP3 Codec with OCaml/OxCaml]
<https://www.tunbury.org/2026/02/11/fifteen/>
[Announcing New Wasm_of_ocaml Optimisations]
<https://tarides.com/blog/2026-02-11-announcing-new-wasm-of-ocaml-optimisat=
ions>
Old CWN
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
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:[email protected]>
[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/>
--=-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-02-17 Tue 14:45 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.02.10.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.02.24.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of February 10 to 17, 20=
26.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">trace 0.11</a></li>
<li><a href=3D"#2">Bogue, the OCaml GUI</a></li>
<li><a href=3D"#3">OCaml examples of computing with encrypted or private da=
ta</a></li>
<li><a href=3D"#4">CMake, Ninja and Google or-tools packages</a></li>
<li><a href=3D"#5">Neocaml-mode (A modern Emacs major mode for OCaml) is lo=
oking for testers</a></li>
<li><a href=3D"#6">YOCaml, a framework for static site generator</a></li>
<li><a href=3D"#7">Other OCaml News</a></li>
<li><a href=3D"#org55d2199">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">trace 0.11</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-trace-0-11/17796/1">htt=
ps://discuss.ocaml.org/t/ann-trace-0-11/17796/1</a>
</p>
</div>
<div id=3D"outline-container-orgaf8a0a2" class=3D"outline-3">
<h3 id=3D"orgaf8a0a2">Simon Cruanes announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgaf8a0a2">
<p>
Dear all, I'm delighted to announce the release of <a href=3D"https://githu=
b.com/ocaml-tracing/ocaml-trace/releases/tag/v0.11">trace 0.11</a>. This is=
a major release and hopefully the last one before 1.0.
</p>
<p>
<a href=3D"https://github.com/ocaml-tracing/ocaml-trace/">trace</a> is a li=
ghtweight foundation for instrumentation, a bit like <a href=3D"https://git=
hub.com/tokio-rs/tracing">rust's tracing</a>. It provides a <span class=3D"=
underline">protocol</span> between, one the one hand, libraries and applica=
tions that are instrumented; and a <span class=3D"underline">collector</spa=
n> that decides what to do with that. My hope is that projects (especially =
libraries) can adopt <code>trace</code> without fear because of the tiny fo=
otprint and high flexibility, the same way <code>logs</code> is used in man=
y places. Existing collectors can produce <a href=3D"https://docs.google.co=
m/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit">chrome form=
at traces</a>, fuchsia traces, plug into <a href=3D"https://github.com/ocam=
l-tracing/ocaml-tracy">tracy</a>, or into <a href=3D"https://github.com/oca=
ml-tracing/ocaml-opentelemetry">opentelemetry</a>; a bridge to <code>Runtim=
e_events</code> is planned[^1].
</p>
<p>
[^1]: trace is more flexible than <code>Runtime_events</code> and works on =
OCaml 4, but of course it should be possible to have both interoperate!
</p>
<p>
<a href=3D"https://ocaml-tracing.github.io/ocaml-trace/trace/Trace_core/ind=
ex.html">API docs for the main library</a>
</p>
</div>
<div id=3D"outline-container-orgcd11718" class=3D"outline-4">
<h4 id=3D"orgcd11718">brief example</h4>
<div class=3D"outline-text-4" id=3D"text-orgcd11718">
<p>
A simple example program from the readme:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> (<span style=3D"color: #a7601f;">let@</span>) =3D (<s=
pan style=3D"color: #a7601f;">@@</span>)
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">run</span> () =3D
<span style=3D"color: #557400; font-weight: bold;">Trace.</span>set_proce=
ss_name <span style=3D"color: #ca3400;">"main"</span>;
<span style=3D"color: #557400; font-weight: bold;">Trace.</span>set_threa=
d_name <span style=3D"color: #ca3400;">"t1"</span>;
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">n</span> =3D <span style=3D"color: #557400; font-weigh=
t: bold;">ref</span> 0 <span style=3D"color: #242521; font-weight: bold;">i=
n</span>
<span style=3D"color: #006f00; font-weight: bold;">for</span> _i =3D 1 <s=
pan style=3D"color: #006f00; font-weight: bold;">to</span> 50 <span style=
=3D"color: #006f00; font-weight: bold;">do</span>
<span style=3D"color: #242521; font-weight: bold;">let@</span> <span st=
yle=3D"color: #007a9f;">_sp</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Trace.</span>with_span ~<span style=3D"color: #00824f;">__FI=
LE__</span> ~<span style=3D"color: #00824f;">__LINE__</span> <span style=3D=
"color: #ca3400;">"outer.loop"</span> <span style=3D"color: #242521; font-w=
eight: bold;">in</span>
<span style=3D"color: #006f00; font-weight: bold;">for</span> _j =3D 2 =
<span style=3D"color: #006f00; font-weight: bold;">to</span> 5 <span style=
=3D"color: #006f00; font-weight: bold;">do</span>
incr n;
<span style=3D"color: #242521; font-weight: bold;">let</span> <span s=
tyle=3D"color: #007a9f;">_sp</span> =3D <span style=3D"color: #557400; font=
-weight: bold;">Trace.</span>with_span ~<span style=3D"color: #00824f;">__F=
ILE__</span> ~<span style=3D"color: #00824f;">__LINE__</span> <span style=
=3D"color: #ca3400;">"inner.loop"</span> <span style=3D"color: #242521; fon=
t-weight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Trace.</span>messa=
gef (<span style=3D"color: #006f00; font-weight: bold;">fun</span> <span st=
yle=3D"color: #007a9f;">k</span> -> k <span style=3D"color: #ca3400;">"h=
ello %d %d"</span> _i _j);
<span style=3D"color: #557400; font-weight: bold;">Trace.</span>messa=
ge <span style=3D"color: #ca3400;">"world"</span>;
<span style=3D"color: #557400; font-weight: bold;">Trace.</span>count=
er_int <span style=3D"color: #ca3400;">"n"</span> <span style=3D"color: #9f=
0d0f;">!</span>n;
<span style=3D"color: #006f00; font-weight: bold;">done</span>
<span style=3D"color: #006f00; font-weight: bold;">done</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> () =3D
<span style=3D"color: #8f6f4a; font-style: italic;">(* </span><span style=
=3D"color: #8f6f4a; font-style: italic;">here we setup the collector</span>=
<span style=3D"color: #8f6f4a; font-style: italic;"> *)</span>
<span style=3D"color: #242521; font-weight: bold;">let@</span> () =3D <sp=
an style=3D"color: #557400; font-weight: bold;">Trace_tef.</span>with_setup=
<span style=3D"color: #444fcf; font-weight: bold;">~out</span>:(<span styl=
e=3D"color: #242521;">`File</span> <span style=3D"color: #ca3400;">"trace.j=
son"</span>) () <span style=3D"color: #242521; font-weight: bold;">in</span>
run ()
</code></pre>
</div>
<p>
If we run the program with <code>TRACE=3D1</code> to enable this particular=
collector, we get a trace file in <code>trace.json</code> (but with actual=
timestamps):
</p>
<pre class=3D"example" id=3D"org805d623">
[{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"}},
{"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name":"t1"}},
{"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"I"},
{"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"},
{"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}},
=E2=80=A6
</pre>
<p>
Opening it in <a href=3D"https://ui.perfetto.dev">https://ui.perfetto.dev</=
a> we get something like this:
</p>
<p>
<a href=3D"https://github.com/ocaml-tracing/ocaml-trace/blob/main/media/ui.=
png?raw=3Dtrue">screenshot of perfetto UI</a>
</p>
</div>
</div>
<div id=3D"outline-container-org852d535" class=3D"outline-4">
<h4 id=3D"org852d535">what's new in 0.11</h4>
<div class=3D"outline-text-4" id=3D"text-org852d535">
<p>
0.11 contains major changes, almost all of which are breaking <span class=
=3D"underline">on the collector side</span>. Instrumented programs should b=
e <b><b>mostly</b></b> unaffected, aside from many deprecation warnings.
</p>
<p>
The core change is that <code>Trace.span</code> is <a href=3D"https://ocaml=
-tracing.github.io/ocaml-trace/trace/Trace_core/index.html#type-span">now</=
a> an <b><b>open sum type</b></b>, and not <code>int64</code>. This means l=
ess global state and fewer tables needed: collectors can pick exactly what =
data gets carried from the <code>enter_span</code> site into the <code>exit=
_span</code> site, if any. In turns, collectors get simpler and faster. The=
notion of "manual" span is now dead (a simple alias to normal spans) and a=
ll related functions are deprecated. 1.0 will not have this notion at all.
</p>
<p>
In addition, collectors are now <a href=3D"https://ocaml-tracing.github.io/=
ocaml-trace/trace/Trace_core/Collector/index.html">a bag of callbacks+a sta=
te</a>, rather than a first class module. <code>trace.subscriber</code> has=
been removed because the notion of subscriber is subsumed by the notion of=
collector (now more easily composable). The TEF and fuchsia collectors are=
now simpler and free of global state.
</p>
<p>
<code>user_data</code> is now a polymorphic variant to, for better ease of =
use. Metrics are an open sum type, and the previous <code>int</code> and <c=
ode>float</code> cases are just provided as constructors of this type. Depe=
ndencies on <code>thread-local-storage</code> and <code>hmap</code> are now=
entirely gone.
</p>
</div>
</div>
<div id=3D"outline-container-orge0fe8cd" class=3D"outline-4">
<h4 id=3D"orge0fe8cd">organization note</h4>
<div class=3D"outline-text-4" id=3D"text-orge0fe8cd">
<p>
Note: the project has moved from my gh account (c-cube) to a dedicated orga=
nization <a href=3D"https://github.com/ocaml-tracing/">ocaml-tracing</a> fo=
r telemetry and tracing projects. Other projects such as <a href=3D"https:/=
/github.com/ocaml-tracing/ocaml-opentelemetry">opentelemetry</a> have also =
migrated there.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Bogue, the OCaml GUI</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-bogue-the-ocaml-gui/909=
9/65">https://discuss.ocaml.org/t/ann-bogue-the-ocaml-gui/9099/65</a>
</p>
</div>
<div id=3D"outline-container-org59323fb" class=3D"outline-3">
<h3 id=3D"org59323fb">Continuing this thread, sanette announced</h3>
<div class=3D"outline-text-3" id=3D"text-org59323fb">
<p>
Hi
</p>
<p>
I'm happy to announce <a href=3D"https://github.com/sanette/bogue">Bogue</a=
> version 20260208, now available on opam.
</p>
<p>
The main novelties are
</p>
<ul class=3D"org-ul">
<li>Color management has been improved (<span class=3D"underline">warning: =
breaking change</span>)</li>
<li>New: <b>Text input validator</b> : you can write rules (or simply a reg=
exp) to warn the user whether the text they are typing is correct.</li>
<li>New: <b>Mailbox</b> module: setup a mailbox server and send arbitrary m=
essages between widgets.</li>
<li>Installation on Windows has been simplified.</li>
<li>Compatibility with old versions of SDL.</li>
</ul>
<p>
Have fun!
</p>
<p>
Here are the details:
</p>
<ul class=3D"org-ul">
<li><i>Colors</i>: All colors and some of the API have been split into the =
<code>RGB</code> and <code>RGBA</code> modules. Named colors are now true i=
dentifiers:=20
<ul class=3D"org-ul">
<li>instead of writing <code>let c =3D Draw.find_color "aliceblue</code> yo=
u should now use <code>let c =3D RGB.aliceblue</code>; and instead of <code=
>let c =3D Draw.(opaque (find_color "aliceblue"))</code> you write now <co=
de>let c =3D RGBA.aliceblue</code>.</li>
<li>if you're lazy to correct these, you may simply do <code>open Bogue.RGB=
open Bogue.RGBA</code>; it should be enough in most cases.</li>
</ul></li>
<li><p>
<i>Text input validator</i>: Example using the included <b>email validator<=
/b>:=20
</p>
<div id=3D"orgcc63d60" class=3D"figure">
<p><img src=3D"https://us1.discourse-cdn.com/flex020/uploads/ocaml/original=
/2X/c/c57cd7fef6d0c6726b3fde63bab8052a1a91012f.webp" alt=3D"c57cd7fef6d0c67=
26b3fde63bab8052a1a91012f.webp" width=3D"80%" />
</p>
</div></li>
<li><i>Mailbox API</i>: for complicated GUIs with circular connnections bet=
ween widgets, the usual Bogue solution was to use an <code>update</code> ev=
ent, see <a href=3D"https://sanette.github.io/bogue-tutorials/bogue-tutoria=
ls/modif_parent.html#method-2:-use-update-events-to-get-rid-of-recursivity!=
">here</a>. Now this method has been leveraged to a full Mailbox system whe=
re any type of message can be sent.</li>
<li><i>Windows</i> users should follow the instructions <a href=3D"https://=
github.com/sanette/bogue#installing-on-windows">here</a>. Continuous testin=
g (CI) is now guaranteed to work on Windows mingw64 (and of course Linux an=
d MacOS)</li>
<li><i>SDL</i>: if you have an old version of SDL (>=3D 2.0.6) and are t=
oo lazy to upgrade, rejoice: simply follow the instructions <a href=3D"http=
s://github.com/sanette/bogue#sdl2-troubleshooting">here</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">OCaml examples of computing with encrypted or private data</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-examples-of-compu=
ting-with-encrypted-or-private-data/17799/1">https://discuss.ocaml.org/t/an=
n-ocaml-examples-of-computing-with-encrypted-or-private-data/17799/1</a>
</p>
</div>
<div id=3D"outline-container-orgf8939f1" class=3D"outline-3">
<h3 id=3D"orgf8939f1">Xavier Leroy announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf8939f1">
<p>
Last Fall, I gave a <a href=3D"https://xavierleroy.org/CdF/2025-2026/en/ind=
ex.html">series of lectures</a> on secure computing (computing with encryp=
ted or private data).
</p>
<p>
Here is some companion OCaml code that demonstrates these techniques: <a hr=
ef=3D"https://github.com/xavierleroy/secure-computing">https://github.com/x=
avierleroy/secure-computing</a> .
</p>
<p>
If you're curious about homomorphic encryption, zero-knowledge proofs, secu=
re multi-party computation, oblivious transfers, private set intersection a=
nd so on, you might enjoy these code examples and the explanations given in=
the lectures.
</p>
<p>
This code is probably insecure and not intended to be used in actual high-s=
ecurity applications. If you're into this kind of things, see <a href=3D"h=
ttps://www.belenios.org/">Belenios</a>, an excellent e-voting system writte=
n in OCaml that uses many of these secure computing techniques.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">CMake, Ninja and Google or-tools packages</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-dk0-cmake-ninja-and-goo=
gle-or-tools-packages/17805/1">https://discuss.ocaml.org/t/ann-dk0-cmake-ni=
nja-and-google-or-tools-packages/17805/1</a>
</p>
</div>
<div id=3D"outline-container-orga383609" class=3D"outline-3">
<h3 id=3D"orga383609">jbeckford announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga383609">
<p>
It is my pleasure to announce the following packages for (<a href=3D"https:=
//discuss.ocaml.org/t/ann-the-dk0-build-system/17709">https://discuss.ocaml=
.org/t/ann-the-dk0-build-system/17709</a>):
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_=
Build/CMake0.values.lua"><code>[email protected]</code></a> a=
nd <a href=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_B=
uild/Ninja0.values.jsonc"><code>[email protected]</code></a>:=
CMake and Ninja. The C compiler, Ninja and CMake are the basic tools used =
to build the majority of modern C projects.</li>
<li><a href=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev=
_OR/Tools.values.lua"><code>[email protected]</code></a> a=
nd <a href=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotInriaParka=
s_Caml/ORTools.values.jsonc"><code>[email protected]</code=
></a>: Google's <code>or-tools</code> libraries discussed by @tbrk in a cou=
ple threads last week (<a href=3D"https://discuss.ocaml.org/t/dune-cmake-an=
d-j/17768/6?u=3Djbeckford">https://discuss.ocaml.org/t/dune-cmake-and-j/177=
68/6?u=3Djbeckford</a> and <a href=3D"https://discuss.ocaml.org/t/foreign-a=
rchives-no-static-libraries-dylib-on-mac/17669/10?u=3Djbeckford">https://di=
scuss.ocaml.org/t/foreign-archives-no-static-libraries-dylib-on-mac/17669/1=
0?u=3Djbeckford</a>)</li>
</ul>
<p>
These packages are my <i>start</i> to a clean replacement for opam <code>de=
pexts</code>. <code>depexts</code> does not work well for me: basic enginee=
ring (reproducibility) is gone, system packages often are too far behind th=
eir upstream versions, the complete unavailability for Windows users, the o=
ccasional symlink break with homebrew, etc.
</p>
<p>
Here's the basic idea (macOS only for now):
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-shell"><code><span style=3D"color: #8f6f4a; font-styl=
e: italic;"># </span><span style=3D"color: #8f6f4a; font-style: italic;">Th=
ere are other ways to install dk0 but for now use this
</span>$ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc
<span style=3D"color: #8f6f4a; font-style: italic;"># </span><span style=3D=
"color: #8f6f4a; font-style: italic;">Then invoke a fully-qualified target =
to build `or-tools`
</span><span style=3D"color: #8f6f4a; font-style: italic;"># </span><span s=
tyle=3D"color: #8f6f4a; font-style: italic;">which will quickly download pr=
ecompiled artifacts
</span>$ dksrc/dk0 --trial get-object [email protected] <s=
pan style=3D"color: #ca3400;">\</span>
-s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/
<span style=3D"color: #8f6f4a; font-style: italic;"># </span><span style=3D=
"color: #8f6f4a; font-style: italic;">See what is there
</span>$ tree target/ocaml-ortools-arm64 --filelimit 5
target/ocaml-ortools-arm64
├── include [33 entries exceeds filelimit, not opening d=
ir]
├── shared
│ └── lib [262 entries exceeds filelimit, not op=
ening dir]
└── static
└── lib [131 entries exceeds filelimit, not opening =
dir]
<span style=3D"color: #8f6f4a; font-style: italic;"># </span><span style=3D=
"color: #8f6f4a; font-style: italic;">...
</span>$ du -sh target/ocaml-ortools-arm64
464M target/ocaml-ortools-arm64
<span style=3D"color: #8f6f4a; font-style: italic;"># </span><span style=3D=
"color: #8f6f4a; font-style: italic;">...
</span>$ find target/ocaml-ortools-arm64 -name <span style=3D"color: #ca340=
0;">'libortools*'</span>
target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.so
target/ocaml-ortools-arm64/shared/lib/libortools.9.so
target/ocaml-ortools-arm64/shared/lib/libortools.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so
target/ocaml-ortools-arm64/static/lib/libortools.a
target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a
</code></pre>
</div>
<blockquote>
<p>
<i><code>or-tools</code> is just a proof of concept to test my CMake packag=
e. I know little about <code>or-tools</code>! I just picked it because it w=
as the C library being discussed last week.</i>
</p>
</blockquote>
<p>
Calling a build target looks at first like installing a package:
</p>
<ul class=3D"org-ul">
<li>you get a 125MB compressed download of precompiled <code>or-tools</code=
> libraries. In this case those libraries have been packaged to follow OCam=
l conventions (both static and shared libraries are present, and <code>.so<=
/code> extensions instead of <code>.dylib</code> on macOS) … the sam=
e thing you expect when you use depexts.</li>
</ul>
<p>
But <code>dk0</code> is a build tool. So if you change to a set of paramete=
rs that has not been precompiled like so:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-shell"><code>rm t/d/val.1/j* <span style=3D"color: #8=
f6f4a; font-style: italic;"># </span><span style=3D"color: #8f6f4a; font-st=
yle: italic;">hack for bug https://github.com/diskuv/dk/issues/98
</span>
dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial <span style=3D"color: #ca3400=
;">\</span>
get-object [email protected] <span style=3D"color: #ca34=
00;">\ </span>
-s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/
</code></pre>
</div>
<p>
the build will happen locally (~1 hour on an M1).
</p>
<p>
This style of build system may be unfamiliar. So my analogies would be:
</p>
<ul class=3D"org-ul">
<li>a <code>nix</code> binary cache with overlays (I haven't personally use=
d <code>nix</code>); JSON and Lua serve the same purpose as the Nix languag=
e, or</li>
<li>an Internet-accessible dune cache that everybody can use; JSON and Lua =
serve the same purpose as dune files and dune <code>(rule ...)</code> expre=
ssions.</li>
</ul>
<p>
The CMake package limitations as of 2026-02-12 … but scroll down in =
this thread to see if I have posted an update:
</p>
<ul class=3D"org-ul">
<li>I haven't had the time to complete dk0 packages for C compilers, so the=
CMake package is incomplete. CMake + Ninja discovers C compilers on macOS =
trivially, and last week's threads were discussing macOS, so I prioritized =
macOS with xcode.</li>
<li>I tested the CMake package on Apple Silicon. Windows is partially teste=
d but don't use Windows yet.</li>
<li>There is no integration with opam or dune yet.</li>
</ul>
<p>
Thanks!
</p>
<p>
—
</p>
</div>
<div id=3D"outline-container-orgca2def4" class=3D"outline-4">
<h4 id=3D"orgca2def4">Building your own packages</h4>
<div class=3D"outline-text-4" id=3D"text-orgca2def4">
<blockquote>
<p>
<i>This is bonus material for those thinking about building dk0 packages</i>
</p>
</blockquote>
<p>
The JSON build file for <code>[email protected]</code> is =
<a href=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotInriaParkas_C=
aml/ORTools.values.jsonc">https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/N=
otInriaParkas_Caml/ORTools.values.jsonc</a>
</p>
<p>
<code>[email protected]</code> uses the C library package =
<code>[email protected]</code>. Its Lua build file is <a h=
ref=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_OR/Tool=
s.values.lua">https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_=
OR/Tools.values.lua</a>.
</p>
<p>
And <code>[email protected]</code> uses the tool package <=
code>[email protected]</code>. You can use a command =
line variation of it (<code>[email protected]</code>) w=
ithout any JSON or Lua build files … here is an example:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-shell"><code>dksrc/dk0 --trial run CommonsBase_Build.=
[email protected] <span style=3D"color: #007a9f;">installdir</span>=3Di/l=
lama-cpp <span style=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'mirrors[]=3Dhttps://github.com/gg=
ml-org/llama.cpp/archive/refs/tags'</span> <span style=3D"color: #ca3400;">=
\</span>
> <span style=3D"color: #ca3400;">'urlpath=3Db7974.zip#be9d624603e39=
cd4edee5fa85e8812eb8e1393537c8e4e4629bc4bd016388053,29881192'</span> <span =
style=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'nstrip=3D1'</span> <span style=3D=
"color: #ca3400;">'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF'</span> <span s=
tyle=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'exe[]=3Dbin/*'</span> <span style=
=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'out[]=3Dbin/llama-quantize'</span=
> <span style=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'outrmglob[]=3Dtest-*'</span> <spa=
n style=3D"color: #ca3400;">'outrmglob[]=3D*.py'</span> <span style=3D"colo=
r: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'outrmglob[]=3Dllama-[a-p]*'</span=
> <span style=3D"color: #ca3400;">'outrmglob[]=3Dllama-[r-z]*'</span> <span=
style=3D"color: #ca3400;">\</span>
> <span style=3D"color: #ca3400;">'outrmexact[]=3Dinclude'</span> <s=
pan style=3D"color: #ca3400;">'outrmexact[]=3Dlib'</span>
</code></pre>
</div>
<p>
With that single command, <code>[email protected]</code=
> will download the popular C package <code>llama.cpp</code>, build a stati=
c library, remove several of its artifacts, and install what remains (espec=
ially bin/llama-quantize) into the <code>i/llama-cpp</code> directory. Then=
type <code>i/llama-cpp/bin/llama-quantize --help</code> to run what you ju=
st built.
</p>
<p>
If you want to make your own CMake-based package for OCaml, work backwards =
from that explanation:
</p>
<ol class=3D"org-ol">
<li>use the command line first to build a CMake project. It will do the dow=
nload, and run the <code>cmake -G</code>, <code>cmake --build</code>, <code=
>cmake --install</code> on your behalf. The <code>dk0</code> error messages=
usually print with helpful recommendations, and look at the top of <a href=
=3D"https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/CommonsBase_Build/CMake=
0.values.lua"><code>[email protected]</code></a> for document=
ation.</li>
<li>then make a Lua build file to package it for C. You'll make a Lua funct=
ion ("rule") to set the command line arguments (what you tested in the last=
step). At minimum, you need your Lua rule to say how to get static vs shar=
ed libraries (you need both), and what CMake flags to use for what platform=
s.</li>
<li>then make a JSON build file to package it for OCaml. Again, rely on the=
<code>dk0</code> error messages.</li>
<li>then make a GitHub Actions job to distribute it. Here is the GitHub Act=
ions job for one of today's announced packages: <a href=3D"https://github.c=
om/diskuv/dk/blob/7b19425969be61bed0f1d6bf3015dac26d7966e1/.github/workflow=
s/distribute-2.5.yml#L282-L364">https://github.com/diskuv/dk/blob/7b1942596=
9be61bed0f1d6bf3015dac26d7966e1/.github/workflows/distribute-2.5.yml#L282-L=
364</a>. On success, GitHub Actions will print the import commands you can =
run so all the precompiled artifacts are available on your desktop.</li>
</ol>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Neocaml-mode (A modern Emacs major mode for OCaml) is looking =
for testers</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/neocaml-mode-a-modern-emacs=
-major-mode-for-ocaml-is-looking-for-testers/17807/1">https://discuss.ocaml=
.org/t/neocaml-mode-a-modern-emacs-major-mode-for-ocaml-is-looking-for-test=
ers/17807/1</a>
</p>
</div>
<div id=3D"outline-container-orgc08b760" class=3D"outline-3">
<h3 id=3D"orgc08b760">Bozhidar Batsov announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgc08b760">
<p>
Hey everyone,
</p>
<p>
Just wanted to let you know I=E2=80=99ve spent a bit of time polishing <a h=
ref=3D"https://github.com/bbatsov/neocaml">neocaml</a> and I think now it=
=E2=80=99s ready to be used (or at least tested) by more people. The font-l=
ocking and indentation are more or less done, and there=E2=80=99s also a ba=
sic integration with OCaml toplevels. Coupled with something like <code>oca=
ml-eglot</code> the existing functionality should get you pretty far.
</p>
<p>
You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80=99l=
l find detailed instructions there), but I=E2=80=99ve also opened a MELPA r=
ecipe PR, so I hope the installation process will become simpler soon.
</p>
<p>
Feel free to share feedback and feature requests here and over at GitHub!
</p>
<p>
P.S. I know the name is a bit controversial (some people said it evokes nvi=
m vibes), and the down the road I may just rename it to ocaml-mode or try t=
o merge it with Tuareg. Naming remains hard=E2=80=A6
</p>
</div>
</div>
<div id=3D"outline-container-orge7c783d" class=3D"outline-3">
<h3 id=3D"orge7c783d">Bozhidar Batsov later added</h3>
<div class=3D"outline-text-3" id=3D"text-orge7c783d">
<p>
A couple of small updates:
</p>
<ul class=3D"org-ul">
<li>Neocaml is now on MELPA <a href=3D"https://melpa.org/#/neocaml">https:/=
/melpa.org/#/neocaml</a></li>
<li>I wrote a short blog post about the first =E2=80=9Cofficial=E2=80=9D re=
lease <a href=3D"https://batsov.com/articles/2026/02/14/neocaml-0-1-ready-f=
or-action/">https://batsov.com/articles/2026/02/14/neocaml-0-1-ready-for-ac=
tion/</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">YOCaml, a framework for static site generator</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-yocaml-a-framework-for-=
static-site-generator/15393/12">https://discuss.ocaml.org/t/ann-yocaml-a-fr=
amework-for-static-site-generator/15393/12</a>
</p>
</div>
<div id=3D"outline-container-orgdaa65a1" class=3D"outline-3">
<h3 id=3D"orgdaa65a1">Continuing this thread, Xavier Van de Woestyne announ=
ced</h3>
<div class=3D"outline-text-3" id=3D"text-orgdaa65a1">
<p>
<b>[ANN] YOCaml 3.0.0</b>
</p>
<blockquote>
<p>
It had been a while since we announced a release of YOCaml (since <code>2.5=
.0</code>), but this weekend we released version <code>3.0.0</code> (alread=
y available on OPAM)!
</p>
</blockquote>
<p>
Since version <code>2.5.0</code>, many changes have been made to YOCaml, wh=
ich you can read about in the release notes for the various versions releas=
ed over the months: (<a href=3D"https://github.com/xhtmlboi/yocaml/releases=
/tag/v2.6.0"><code>2.6.0</code></a>, <a href=3D"https://github.com/xhtmlboi=
/yocaml/releases/tag/v2.7.0"><code>2.7.0</code></a>, <a href=3D"https://git=
hub.com/xhtmlboi/yocaml/releases/tag/v2.8.0"><code>2.8.0</code></a>).
</p>
<p>
Some major innovations that can be noted are:
</p>
<ul class=3D"org-ul">
<li>YOCaml finally deletes files that it did not create, which allows for i=
ntermediate build steps that construct finer caches (making it possible, fo=
r example, to create <a href=3D"https://en.wikipedia.org/wiki/Backlink">bac=
klinks</a> or <a href=3D"https://en.wikipedia.org/wiki/Transclusion">transc=
lusions</a>) (<a href=3D"https://github.com/xhtmlboi/yocaml/pull/108">yocam=
l#108</a>)</li>
<li>As mentioned by @benfaerber, adding <code>yocaml_liquid</code> as an al=
ternative template engine. (<a href=3D"https://github.com/xhtmlboi/yocaml/p=
ull/101">yocaml#101</a>)</li>
<li>Major improvements to the validation/projection language (and greater r=
igour in the concept of validation/normalisation) (<a href=3D"https://githu=
b.com/xhtmlboi/yocaml/pull/98">yocaml#98</a>, <a href=3D"https://github.com=
/xhtmlboi/yocaml/pull/109">yocaml#109</a>, <a href=3D"https://github.com/xh=
tmlboi/yocaml/pull/115">yocaml#115</a>)</li>
<li>Greater control over the iteration logic of actions, allowing recursive=
traversal of file system fragments, among other things (<a href=3D"https:/=
/github.com/xhtmlboi/yocaml/pull/111">yocaml#111</a>).</li>
<li><span class=3D"underline">Last but not least</span>, in this poorly nam=
ed PR, <a href=3D"https://github.com/xhtmlboi/yocaml/pull/120">yocaml#120</=
a>, we added the possibility for a task to create multiple files and replac=
ed the internal representation of time. Previously, we used integers, but n=
ow we have switched to floats, which offer greater precision (and allow CI =
to correctly execute CRAM tests that generate sites).</li>
</ul>
<p>
In addition, there are bug fixes, usability improvements, and… <b><b=
>a drastic improvement in error reporting</b></b>, which I will explain in =
the next section!
</p>
</div>
<div id=3D"outline-container-org668ba91" class=3D"outline-4">
<h4 id=3D"org668ba91">About the Outreachy</h4>
<div class=3D"outline-text-4" id=3D"text-org668ba91">
<p>
Many of the improvements to YOCaml were made possible thanks to various par=
ticipants in the <a href=3D"https://www.outreachy.org/">Outreachy programme=
</a>, which led to @Linda_Njau being selected as an intern! His work is div=
ided into two specific areas:
</p>
<ul class=3D"org-ul">
<li>Drastically improve YOCaml error reporting : <a href=3D"https://github.=
com/xhtmlboi/yocaml/pull/113">yocaml#113</a>, <a href=3D"https://github.com=
/xhtmlboi/yocaml/pull/114">yocaml#114</a>, <a href=3D"https://github.com/xh=
tmlboi/yocaml/pull/116">yocaml#116</a>. Before these patches, YOCaml errors=
were extremely difficult to diagnose. Since @Linda_Njau took care of them,=
they are now easier to read, provide context (which file failed to create,=
and which file was being read), and are displayed in the preview server, s=
o you don't have to go and read the terminal!</li>
<li>The second part of his internship involves working on <a href=3D"https:=
//github.com/yocaml/yocaml-codex">yocaml-codex</a>, a project currently und=
er development that aims to provide a standard library of templates for bui=
lding websites faster with YOCaml and sharing the various templates that ha=
ve been written over the course of the websites developed with YOCaml. <spa=
n class=3D"underline">Stay tuned</span>!</li>
</ul>
<p>
We are very satisfied (and impressed) with her work, and she has documented=
her contributions in a blog… freshly designed, with YOCaml, of cour=
se: <a href=3D"https://engineering-yocaml-with-linda.netlify.app/articles/s=
econd_article">https://engineering-yocaml-with-linda.netlify.app/articles/s=
econd_article</a>
</p>
</div>
</div>
<div id=3D"outline-container-orgd76130f" class=3D"outline-4">
<h4 id=3D"orgd76130f">About the tutorial</h4>
<div class=3D"outline-text-4" id=3D"text-orgd76130f">
<p>
The tutorial is progressing slowly but surely, and we have notably added a =
section that describes how to validate/project data to work with most descr=
iption languages (such as Yaml, ToML, etc.) and most template engines (Jing=
oo, Mustache, Liquid) : <a href=3D"https://yocaml.github.io/tutorial/metada=
ta-intro.html">Your Own Data Model</a>
</p>
<p>
We also took the opportunity to clarify the <a href=3D"https://yocaml.githu=
b.io/tutorial/path.html">use of file paths</a> and document <a href=3D"http=
s://yocaml.github.io/tutorial/path-resolver.html">the resolver technique</a=
>!
</p>
<p>
We will continue to write sections and document the use of YOCaml, so if yo=
u have any suggestions, comments, or requests, please send them to us!
</p>
</div>
</div>
<div id=3D"outline-container-org1c44226" class=3D"outline-4">
<h4 id=3D"org1c44226">Closing words</h4>
<div class=3D"outline-text-4" id=3D"text-org1c44226">
<p>
In September last year, I gave a very clumsy (<span class=3D"underline">so =
French</span>) <a href=3D"https://watch.ocaml.org/w/uSaQB8ejXBUdJGgUBfHCW8"=
>presentation of YOCaml at Fun OCaml</a> which presents YOCaml's design cho=
ices!=20
</p>
<p>
YOCaml is becoming increasingly usable thanks to the <a href=3D"https://git=
hub.com/xhtmlboi/yocaml/graphs/contributors">contributions of many people</=
a>! Thank you. If you want to create a static blog/website in OCaml, YOCaml=
is one of many fun options!
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/xhtmlboi/yocaml">Repository</a></li>
<li><a href=3D"https://github.com/xhtmlboi/yocaml/releases/tag/v3.0.0">Rele=
ase note</a></li>
<li><a href=3D"https://ocaml.org/packages/search?q=3Dyocaml">Packages</a></=
li>
</ul>
<p>
=F0=9F=90=AB <span class=3D"underline">Happy hacking and blogging</span> =
=F0=9F=90=AB
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-7" class=3D"outline-2">
<h2 id=3D"7">Other OCaml News</h2>
<div class=3D"outline-text-2" id=3D"text-7">
</div>
<div id=3D"outline-container-org833ac6b" class=3D"outline-3">
<h3 id=3D"org833ac6b">From the ocaml.org blog</h3>
<div class=3D"outline-text-3" id=3D"text-org833ac6b">
<p>
Here are links from many OCaml blogs aggregated at <a href=3D"https://ocaml=
.org/blog/">the ocaml.org blog</a>.
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://www.tunbury.org/2026/02/16/day10/">Day10: opam packa=
ge testing tool</a></li>
<li><a href=3D"https://www.tunbury.org/2026/02/15/ocaml-tessera/">Tessera p=
ipeline in OCaml</a></li>
<li><a href=3D"https://anil.recoil.org/notes/2026w7">.plan-26-07: Storage, =
Lego, Echo, and the IUCN</a></li>
<li><a href=3D"https://batsov.com/articles/2026/02/14/neocaml-0-1-ready-for=
-action/">Neocaml 0.1: Ready for Action</a></li>
<li><a href=3D"https://www.tunbury.org/2026/02/11/fifteen/">The 15-Game</a>=
</li>
<li><a href=3D"https://www.tunbury.org/2026/02/11/fifteen/">Optimizing an M=
P3 Codec with OCaml/OxCaml</a></li>
<li><a href=3D"https://tarides.com/blog/2026-02-11-announcing-new-wasm-of-o=
caml-optimisations">Announcing New Wasm_of_ocaml Optimisations</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-org55d2199" class=3D"outline-2">
<h2 id=3D"org55d2199">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org55d2199">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"orgabd2ad9">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--=-=-=--