Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt <[email protected]> Tue, 14 Jul 2026 09:16:04 +0200
Newsgroups gmane.comp.lang.caml.inria
Message-ID <[email protected]>
--===-=-=
Content-Type: multipart/mixed; boundary="=-=-="

--=-=-=
Content-Type: multipart/alternative; boundary="==-=-="

--==-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hello

Here is the latest OCaml Weekly News, for the week of July 07 to 14,
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

opam 2.5.2
ocaml-wire: a Binary wire format DSL with EverParse 3D output
Caqti 3.0.0
ocgtk 0.1: OCaml bindings for GTK 4 (preview release)
Old CWN


opam 2.5.2
=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-opam-2-5-2/18338/1>


Kate 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

  Hi everyone,

  opam 2.5.2 is now available. This release is fixing:
  =E2=80=A2 a security issue ([OSEC-2026-10])
  =E2=80=A2 a regression from 2.5.1 preventing cross-compiled packages that=
 use
    dune from installing properly ([ocaml/dune#14393])

  We invite everyone to upgrade to 2.5.2 as soon as possible.

  If you depend on the older opam package of your preferred
  distribution, maintainers of distributions such as Debian Stable have
  been notified and we expect backporting of the relevant fixes to be
  available there very soon.

  You can read our [blog post] for relevant links and details.


[OSEC-2026-10]
<https://github.com/ocaml/security-advisories/blob/main/advisories/2026/OSE=
C-2026-10.md>

[ocaml/dune#14393] <https://github.com/ocaml/dune/issues/14393>

[blog post] <https://opam.ocaml.org/blog/opam-2-5-2/>

Try it!
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  The upgrade instructions are unchanged:

  For Unix systems
  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v=
ersion 2.5.2"
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  or from PowerShell for Windows systems
  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o=
rg/install.ps1) } -Version 2.5.2"
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  Please report any issues to the [bug-tracker].

  Happy hacking, <> <> The opam team <> <> :camel:


[bug-tracker] <https://github.com/ocaml/opam/issues>


ocaml-wire: a Binary wire format DSL with EverParse 3D output
=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/ann-ocaml-wire-a-binary-wire-format-dsl-with=
-everparse-3d-output/18009/4>


Continuing this thread, Thomas Gazagnaire 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

  I'm happy to announce that `ocaml-wire' 1.0.0 is now on opam,
  installable with `opam install wire'.

  This release brings a round of robustness fixes and API cleanups to
  the previous version (hence the 1.0.0 tag). It also adds a lot of
  differential testing between the OCaml parsers/serialisers and the
  generated verified C parsers. Both are run on randomly generated
  schemas and random input bytes, and the test checks that they agree on
  what they accept or reject, and on the values they decode. Wherever
  they disagreed there was a bug, and those all seem to be fixed now.

        But how can these be interpreted as signed integers or
        floats? Is this left to the layers above?

  EverParse 3D has no signed or floating-point types, only unsigned
  integers, so to the C validator an int8 is a UINT8 and a float64 is a
  UINT64. The OCaml decoder does the reinterpretation, two's complement
  for the signed types and IEEE 754 for the floats, and for a plain
  field both sides accept every bit pattern. A constraint on the field
  (that the user would have added via the DSL) has to survive that
  projection. A signed ordering constraint has to be rewritten through
  the two's-complement identity before it reaches the C validator,
  because a naive unsigned comparison disagrees on bytes with the sign
  bit set (byte 200 is the signed value -56, accepted by OCaml and
  rejected by the naive C bound). Float finiteness (`is_finite',
  `is_nan') compiles to a test on the exponent bits, and a float
  ordering constraint, which has no faithful unsigned form, is rejected
  up front. The differential fuzzing is what surfaced those sign-bit
  disagreements and all of this has been hardened between 0.9 and 1.0.

  Zero-copy reads got safer too. `Codec.validate' now enforces every
  check `Codec.decode' does (enum membership, bounds, padding, `where'
  clauses), so validating untrusted input before a batch of zero-copy
  `Codec.get' calls no longer trusts bytes the decoder would have
  rejected (again, caught thanks to differential testing).

  The generated `.3d' files also turned out to be quite readable as
  protocol descriptions, and a whole codec family now projects to a
  single .3d that doubles as a spec and compiles to a standalone
  verified C parser with no FFI. The TCP/IP stack is a good one to
  compare: the [OCaml definitions] and the [generated 3d file].


[OCaml definitions]
<https://github.com/parsimoni-labs/ocaml-wire/blob/main/examples/net/net.ml>

[generated 3d file]
<https://github.com/parsimoni-labs/ocaml-wire/blob/main/examples/net/Net.3d>


Caqti 3.0.0
=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-caqti-3-0-0/18335/1>


Petter A. Urkedal 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

  I am happy to announce the release of [Caqti] 3.0.0.  This release
  bundles some breaking changes including switching to hierarchical
  modules.  The Caqti 3 API is mainly a reorganization of the
  `caqti.template' preview library and some remaining modules from the
  Caqti 2 API.

  Release notes:

  =E2=80=A2 The `caqti' library now holds the Caqti 3 API and `caqti.classi=
c'
    contains a Caqti 2 compatibility wrapper.  Users of the Caqti 2 API
    must now add `caqti.classic' to their link lines.  Early adopters of
    the Caqti 3 API must replace `caqti.template' with `caqti' and
    adjust some module paths.  Switching to the new API is recommended,
    but may be done incrementally for existing applications.

  =E2=80=A2 Fixed initial comma when formatting rows, affecting
    `Caqti_type.pp_value' (Caqti 2) and `Caqti.Template.Row.pp' (Caqti
    3).

  =E2=80=A2 Put on hold deprecation of the `caqti-dynload' package due to [=
issue
    #140].

  =E2=80=A2 Foreign key constraints are now enabled for SQLite by default.

  It's good if opam-released projects add `caqti.classic' to their link
  lines before their next release (or switch API) and raise the lower
  bound on caqti to 2.3.0 (cf [the previous announcement]) if necessary.


[Caqti] <https://github.com/paurkedal/ocaml-caqti/>

[issue #140] <https://github.com/paurkedal/ocaml-caqti/issues/140>

[the previous announcement]
<https://discuss.ocaml.org/t/ann-caqti-2-3-0/17985>


ocgtk 0.1: OCaml bindings for GTK 4 (preview release)
=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-ocgtk-0-1-ocaml-bindings-for-gtk-4-previ=
ew-release/17944/6>


Continuing this thread, Chris Armstrong 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

  *ocgtk 0.1-preview2 is now available on opam*

  This release significantly increases the amount of generated
  functionality, covering the vast majority of classes snd methods
  available in it=E2=80=99s generated libraries (GTK, Gio, Pango, Cairo, GD=
K,
  GDKpixbuf, Graphene)


Notable changes
=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=97=8A Extended Signals support

  Signsls with multiple parameters and non boolean return parameters are
  now supported, giving coverage to about 2/3 of supported signal types


=E2=97=8A GValue support

  GValue is now properly supported as a prerequisite for proper signals
  support


=E2=97=8A Extended primitives support

  Full coverage of integer types, list types, better array handling,
  GError mapping to result types and better GObject equality and
  hashing. All extend the coverage of supported methods that can be
  generated.


=E2=97=8A Memory management

  A significant effort has gone into hunting down memory management
  bugs, especially with boxed record types, which now use a consistent
  GLib mechanism for handling references to them.


=E2=97=8A Extended operating system and compiler versions support

  Most dependencies of ocgtk have been removed as they were only
  necessary for code generation, allowing us to extend support to
  Windows (MSYS2 only) and Ocaml versions going back to 4.14.


=E2=97=8A Other improvements

  =E2=80=A2 Better handling of mutually dependent classes and interfaces by
    shortening their internal module name
  =E2=80=A2 constructor generation for classes: with this, we can do away w=
ith
    aliasing classes at the top level, presenting only their class types
    and constructors, also making unused code elimination better and
    reducing compilation bottlenecks

  The next release will focus on improved API documentation generation
  and gaps in record support and other primitives (constants, functions,
  callbacks, etc).


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-07-14 Tue 09:15 -->
<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;
    @supports (content: attr(data-linenr)) {
      visibility: hidden;
      &::before { content: attr(data-linenr); visibility: visible; }
    }
  }
  .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.07.07.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.07.21.html">Next Week</a>
</p>

<p>
Hello
</p>

<p>
Here is the latest OCaml Weekly News, for the week of July 07 to 14, 2026.
</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">opam 2.5.2</a></li>
<li><a href=3D"#2">ocaml-wire: a Binary wire format DSL with EverParse 3D o=
utput</a></li>
<li><a href=3D"#3">Caqti 3.0.0</a></li>
<li><a href=3D"#4">ocgtk 0.1: OCaml bindings for GTK 4 (preview release)</a=
></li>
<li><a href=3D"#orge2de576">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">opam 2.5.2</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-opam-2-5-2/18338/1">htt=
ps://discuss.ocaml.org/t/ann-opam-2-5-2/18338/1</a>
</p>
</div>
<div id=3D"outline-container-orga0c8ba0" class=3D"outline-3">
<h3 id=3D"orga0c8ba0">Kate announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga0c8ba0">
<p>
Hi everyone,
</p>

<p>
opam 2.5.2 is now available. This release is fixing:
</p>
<ul class=3D"org-ul">
<li>a security issue (<a href=3D"https://github.com/ocaml/security-advisori=
es/blob/main/advisories/2026/OSEC-2026-10.md">OSEC-2026-10</a>)</li>
<li>a regression from 2.5.1 preventing cross-compiled packages that use dun=
e from installing properly (<a href=3D"https://github.com/ocaml/dune/issues=
/14393">ocaml/dune#14393</a>)</li>
</ul>

<p>
We invite everyone to upgrade to 2.5.2 as soon as possible.
</p>

<p>
If you depend on the older opam package of your preferred distribution, mai=
ntainers of distributions such as Debian Stable have been notified and we e=
xpect backporting of the relevant fixes to be available there very soon.
</p>

<p>
You can read our <a href=3D"https://opam.ocaml.org/blog/opam-2-5-2/">blog p=
ost</a> for relevant links and details.
</p>
</div>
<div id=3D"outline-container-org3e3abfe" class=3D"outline-4">
<h4 id=3D"org3e3abfe">Try it!</h4>
<div class=3D"outline-text-4" id=3D"text-org3e3abfe">
<p>
The upgrade instructions are unchanged:
</p>

<p>
For Unix systems
</p>
<pre class=3D"example" id=3D"org99e6be0">
bash -c "sh &lt;(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
5.2"
</pre>
<p>
or from PowerShell for Windows systems
</p>
<pre class=3D"example" id=3D"org62db0d8">
Invoke-Expression "&amp; { $(Invoke-RestMethod https://opam.ocaml.org/insta=
ll.ps1) } -Version 2.5.2"
</pre>
<p>
Please report any issues to the <a href=3D"https://github.com/ocaml/opam/is=
sues">bug-tracker</a>.
</p>

<p>
Happy hacking,
&lt;&gt; &lt;&gt; The opam team &lt;&gt; &lt;&gt; :camel:
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">ocaml-wire: a Binary wire format DSL with EverParse 3D output<=
/h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-wire-a-binary-wir=
e-format-dsl-with-everparse-3d-output/18009/4">https://discuss.ocaml.org/t/=
ann-ocaml-wire-a-binary-wire-format-dsl-with-everparse-3d-output/18009/4</a>
</p>
</div>
<div id=3D"outline-container-orgcb1a840" class=3D"outline-3">
<h3 id=3D"orgcb1a840">Continuing this thread, Thomas Gazagnaire announced</=
h3>
<div class=3D"outline-text-3" id=3D"text-orgcb1a840">
<p>
I'm happy to announce that <code>ocaml-wire</code> 1.0.0 is now on opam, in=
stallable with <code>opam install wire</code>.
</p>

<p>
This release brings a round of robustness fixes and API cleanups to the pre=
vious version (hence the 1.0.0 tag). It also adds a lot of differential tes=
ting between the OCaml parsers/serialisers and the generated verified C par=
sers. Both are run on randomly generated schemas and random input bytes, an=
d the test checks that they agree on what they accept or reject, and on the=
 values they decode. Wherever they disagreed there was a bug, and those all=
 seem to be fixed now.
</p>

<blockquote>
<p>
But how can these be interpreted as signed integers or floats? Is this left=
 to the layers above?
</p>
</blockquote>

<p>
EverParse 3D has no signed or floating-point types, only unsigned integers,=
 so to the C validator an int8 is a UINT8 and a float64 is a UINT64. The OC=
aml decoder does the reinterpretation, two's complement for the signed type=
s and IEEE 754 for the floats, and for a plain field both sides accept ever=
y bit pattern. A constraint on the field (that the user would have added vi=
a the DSL) has to survive that projection. A signed ordering constraint has=
 to be rewritten through the two's-complement identity before it reaches th=
e C validator, because a naive unsigned comparison disagrees on bytes with =
the sign bit set (byte 200 is the signed value -56, accepted by OCaml and r=
ejected by the naive C bound). Float finiteness (<code>is_finite</code>, <c=
ode>is_nan</code>) compiles to a test on the exponent bits, and a float ord=
ering constraint, which has no faithful unsigned form, is rejected up front=
. The differential fuzzing is what surfaced those sign-bit disagreements an=
d all of this has been hardened between 0.9 and 1.0.
</p>

<p>
Zero-copy reads got safer too. <code>Codec.validate</code> now enforces eve=
ry check <code>Codec.decode</code> does (enum membership, bounds, padding, =
<code>where</code> clauses), so validating untrusted input before a batch o=
f zero-copy <code>Codec.get</code> calls no longer trusts bytes the decoder=
 would have rejected (again, caught thanks to differential testing).
</p>

<p>
The generated <code>.3d</code> files also turned out to be quite readable a=
s protocol descriptions, and a whole codec family now projects to a single =
.3d that doubles as a spec and compiles to a standalone verified C parser w=
ith no FFI. The TCP/IP stack is a good one to compare: the <a href=3D"https=
://github.com/parsimoni-labs/ocaml-wire/blob/main/examples/net/net.ml">OCam=
l definitions</a> and the <a href=3D"https://github.com/parsimoni-labs/ocam=
l-wire/blob/main/examples/net/Net.3d">generated 3d file</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">Caqti 3.0.0</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-caqti-3-0-0/18335/1">ht=
tps://discuss.ocaml.org/t/ann-caqti-3-0-0/18335/1</a>
</p>
</div>
<div id=3D"outline-container-org980b673" class=3D"outline-3">
<h3 id=3D"org980b673">Petter A. Urkedal announced</h3>
<div class=3D"outline-text-3" id=3D"text-org980b673">
<p>
I am happy to announce the release of <a href=3D"https://github.com/paurked=
al/ocaml-caqti/">Caqti</a> 3.0.0.  This release bundles some breaking chang=
es including switching to hierarchical modules.  The Caqti 3 API is mainly =
a reorganization of the <code>caqti.template</code> preview library and som=
e remaining modules from the Caqti 2 API.
</p>

<p>
Release notes:
</p>

<ul class=3D"org-ul">
<li>The <code>caqti</code> library now holds the Caqti 3 API and <code>caqt=
i.classic</code>
contains a Caqti 2 compatibility wrapper.  Users of the Caqti 2 API must
now add <code>caqti.classic</code> to their link lines.  Early adopters of =
the
Caqti 3 API must replace <code>caqti.template</code> with <code>caqti</code=
> and adjust some
module paths.  Switching to the new API is recommended, but may be done
incrementally for existing applications.</li>

<li>Fixed initial comma when formatting rows, affecting
<code>Caqti_type.pp_value</code> (Caqti 2) and <code>Caqti.Template.Row.pp<=
/code> (Caqti 3).</li>

<li>Put on hold deprecation of the <code>caqti-dynload</code> package due to
<a href=3D"https://github.com/paurkedal/ocaml-caqti/issues/140">issue #140<=
/a>.</li>

<li>Foreign key constraints are now enabled for SQLite by default.</li>
</ul>

<p>
It's good if opam-released projects add <code>caqti.classic</code> to their=
 link lines before their next release (or switch API) and raise the lower b=
ound on caqti to 2.3.0 (cf <a href=3D"https://discuss.ocaml.org/t/ann-caqti=
-2-3-0/17985">the previous announcement</a>) if necessary.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">ocgtk 0.1: OCaml bindings for GTK 4 (preview release)</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocgtk-0-1-ocaml-binding=
s-for-gtk-4-preview-release/17944/6">https://discuss.ocaml.org/t/ann-ocgtk-=
0-1-ocaml-bindings-for-gtk-4-preview-release/17944/6</a>
</p>
</div>
<div id=3D"outline-container-org6c15d84" class=3D"outline-3">
<h3 id=3D"org6c15d84">Continuing this thread, Chris Armstrong announced</h3>
<div class=3D"outline-text-3" id=3D"text-org6c15d84">
<p>
<b>ocgtk 0.1-preview2 is now available on opam</b>
</p>

<p>
This release significantly increases the amount of generated functionality,=
 covering the vast majority of classes snd methods available in it=E2=80=99=
s generated libraries (GTK, Gio, Pango, Cairo, GDK, GDKpixbuf, Graphene)
</p>
</div>
<div id=3D"outline-container-orgd00fb9f" class=3D"outline-4">
<h4 id=3D"orgd00fb9f">Notable changes</h4>
<div class=3D"outline-text-4" id=3D"text-orgd00fb9f">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org50769ca"></a>Extended Signals support<br />
<div class=3D"outline-text-5" id=3D"text-org50769ca">
<p>
Signsls with multiple parameters and non boolean return parameters are now =
supported, giving coverage to about 2/3 of supported signal types
</p>
</div>
</li>
<li><a id=3D"orgb9a0e98"></a>GValue support<br />
<div class=3D"outline-text-5" id=3D"text-orgb9a0e98">
<p>
GValue is now properly supported as a prerequisite for proper signals suppo=
rt
</p>
</div>
</li>
<li><a id=3D"org7f5483f"></a>Extended primitives support<br />
<div class=3D"outline-text-5" id=3D"text-org7f5483f">
<p>
Full coverage of integer types, list types, better array handling, GError m=
apping to result types and better GObject equality and hashing. All extend =
the coverage of supported methods that can be generated.
</p>
</div>
</li>
<li><a id=3D"orgc8ad696"></a>Memory management<br />
<div class=3D"outline-text-5" id=3D"text-orgc8ad696">
<p>
A significant effort has gone into hunting down memory management bugs, esp=
ecially with boxed record types, which now use a consistent GLib mechanism =
for handling references to them.
</p>
</div>
</li>
<li><a id=3D"org433ff6e"></a>Extended operating system and compiler version=
s support<br />
<div class=3D"outline-text-5" id=3D"text-org433ff6e">
<p>
Most dependencies of ocgtk have been removed as they were only necessary fo=
r code generation, allowing us to extend support to Windows (MSYS2 only) an=
d Ocaml versions going back to 4.14.
</p>
</div>
</li>
<li><a id=3D"orgbef35c8"></a>Other improvements<br />
<div class=3D"outline-text-5" id=3D"text-orgbef35c8">
<ul class=3D"org-ul">
<li>Better handling of mutually dependent classes and interfaces by shorten=
ing their internal module name</li>
<li>constructor generation for classes: with this, we can do away with alia=
sing classes at the top level, presenting only their class types and constr=
uctors, also making unused code elimination better and reducing compilation=
 bottlenecks</li>
</ul>

<p>
The next release will focus on improved API documentation generation and ga=
ps in record support and other primitives (constants, functions, callbacks,=
 etc).
</p>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-orge2de576" class=3D"outline-2">
<h2 id=3D"orge2de576">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-orge2de576">
<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"org0297587">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>

</div>
</div>
</div>
</div>
</body>
</html>


--==-=-=--

--=-=-=--

--===-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmpV4jQbFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5ceoOwgAmfFIFtxAECEzOfs6YsCjYPpCD+SnWH2Oe7GNNj1S
21EBYUL62S92Og7xC4nxLr+eHD5gvdW6iPRwlfEZPkeuFlnvK2ulzi3PWx/VgMms
CABLHpRsVNUh+9YMA/I1K+H6FZBQSsUbyjXYmH6ujaKDwdqcdeu6XeBeSl3y8vSJ
00tgb7Zlv6xY3JEpfVr7179XksvR6oRyffGhBFOkhh8Zv+tTUSBebT2KRUOSMyUP
jHGz4pMNhHvg5MPKOGRVEMNyOQMCOwwbf/rTZ81zkawOMCaTU2cw7r7++F7VOxMT
vp31Jyz+ylIneNfUcN/jXJD3VYrfmyUd45pQqSsIInyMAg==
=ZksO
-----END PGP SIGNATURE-----
--===-=-=--