Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt <[email protected]> Tue, 09 Jun 2026 09:39:09 +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 June 02 to 09,
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

Richard Bird Distinguished Dissertation Award
Announcing Pyro Caml: A Continuous Profiler for OCaml
awso 0.9.1: Type-safe coverage for 400+ AWS APIs
OCaml 4.14.3 for Plan 9
Call for Talk Proposals @ OCaml Workshop 2026
Ahrefs Grant Program for OCaml
Old CWN


Richard Bird Distinguished Dissertation Award
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=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/richard-bird-distinguished-dissertation-awar=
d/18215/1>


Fran=C3=A7ois Pottier 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

  Hello fellow users of OCaml, If you or your students have defended a
  PhD in 2025 on a topic related to functional programming, then you may
  apply for the (new) Richard Bird Distinguished Dissertation
  Award. Announcement copied below.

  `=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D'

  CALL FOR NOMINATIONS

  Richard Bird Distinguished Dissertation Award 2025

  Deadline: 31st August 2026

  <http://tinyurl.com/jfp-bird-award>

  `=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D'

  OVERVIEW

  The Journal of Functional Programming is pleased to establish the
  Richard Bird Distinguished Dissertation Award, to recognise an
  outstanding PhD dissertation in functional programming.

  Richard Bird (1943-2022) was one of the leading figures in functional
  programming.  He was a Professor in Oxford, where he founded the
  Algebra of Programming group, and served as Director of the Computing
  Laboratory.  Richard is renowned for his many books and pearls on
  functional programming, which set a lasting standard for clear and
  elegant writing.  It seems fitting that an award be established in his
  name to further encourage these values in the field.

  The award includes a prize of =C2=A31,000.  Funding for the prize is
  supported by a generous donation from Richard himself to further the
  cause of functional programming.

  CRITERIA

  Eligible dissertations must have been completed in 2025.  Depending on
  the institution, this may be the date of the viva, corrections being
  approved, graduation ceremony, or otherwise.

  The award is open to all topics within the remit of JFP, with a
  particular emphasis on dissertations that reflect Richard's own values
  of clarity, simplicity and elegance.  For a dissertation to be
  considered for the award it should:

  =E2=80=A2 Reach a high standard of exposition;

  =E2=80=A2 Make a noteworthy contribution to the subject;

  =E2=80=A2 Place the results in the wider context of computer science.

  NOMINATIONS

  Please submit the following information to the award chair,
  [email protected], by 31st August 2026:

  =E2=80=A2 Two letters of support, explaining why the dissertation should =
be
    considered for the award.  One letter should be from the
    advisor/supervisor, and one from an independent source with no
    conflict of interest with the candidate, such as an external
    examiner or other expert in the field.

  =E2=80=A2 A copy of the dissertation itself.

  AWARD COMMITTEE

  =E2=80=A2 Graham Hutton (chair), University of Nottingham
  =E2=80=A2 Matthew Flatt, University of Utah
  =E2=80=A2 Jeremy Gibbons, University of Oxford
  =E2=80=A2 Fran=C3=A7ois Pottier, INRIA
  =E2=80=A2 Wouter Swierstra, University of Utrecht
  =E2=80=A2 Ningning Xie, University of Toronto

  The JFP editors-in-chief serve as observers of the committee.

  `=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D'


Announcing Pyro Caml: A Continuous Profiler for OCaml
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=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/announcing-pyro-caml-a-continuous-profiler-f=
or-ocaml/18217/1>


Austin Theriault 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

  Hey y'all, last year I gave a [workshop] on observability at Fun
  OCaml, and a few folks asked me what was available for continuous
  profiling, and I wasn't aware of any solutions that supported OCaml
  directly.

  Since then I got the opportunity to work on one, and put it into use
  in production over at Semgrep, and now after battle testing it for a
  few months I'm happy to announce [Pyro Caml] is now available, and on
  [opam].

  I got a good excuse to use a lot of cool OCaml tools like ocaml-rs,
  the runtime event system, and memprof, so needless to say it was a
  bunch of fun to write this :slight_smile: . If you're interested in
  the details I have a blog post [here] covering them.

  Currently it only supports CPU profiling, but we're potentially going
  to add memory/gc profiling in the coming months. Enjoy!


[workshop]
<https://fun-ocaml.com/2025/ocaml-observability-with-opentelemetry/>

[Pyro Caml] <https://github.com/semgrep/pyro-caml>

[opam] <https://opam.ocaml.org/packages/pyro-caml/>

[here]
<https://semgrep.dev/blog/2026/announcing-pyro-caml-continuous-profiler-oca=
ml/>


awso 0.9.1: Type-safe coverage for 400+ AWS APIs
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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-awso-0-9-1-type-safe-coverage-for-400-aw=
s-apis/18220/1>


Michael Bacarella 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

  Greetings OCaml enjoyers,

  Have you been annoyed with terraform plan telling you 10 minutes later
  that you have a typo? Are you frustrated with how type-ambiguous your
  cloud is? (Abe Simpson shaking fist at cloud)

  Or, maybe you wish you could have AWS libraries inside an ecosystem
  you trust.

  Well, this release is for you!

  I'm happy to announce `awso', a comprehensive AWS library. This was
  forked from `https://github.com/solvuu/awsm', which was never released
  to opam. `awso' provides typed OCaml bindings to AWS services
  generated from botocore's service definitions, so the compiler catches
  the typos and shape mismatches.

  The `awso' repo: <https://github.com/mbacarella/ocaml-awso>


What's in the tin
=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

  Typed clients for the full AWS surface area, generated from botocore
  1.43.9

  Four I/O backends:

  =E2=80=A2 `awso-eio' - Eio
  =E2=80=A2 `awso-async' =E2=80=94 Async
  =E2=80=A2 `awso-lwt' =E2=80=94 Lwt
  =E2=80=A2 `awso-sync' =E2=80=94 Synchronous (blocking) over libcurl, for =
easy
    scripting and CLIs

  Also

  =E2=80=A2 `awso-cli': for fun, a kitchen-sink binary exposing every servi=
ce as
    a composable subcommand, in the spirit of the Python aws CLI. (Ships
    as bytecode because linking \~400 native service libraries exceeds
    ARM64 executable size limits; yes really)

  Note: the AWS API is big. `opam install' may take awhile.


An example using Eio
=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=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 (* ec2_describe_instances.ml *)
  =E2=94=82 module Ec2 =3D Awso_ec2_eio
  =E2=94=82=20
  =E2=94=82 let print_row a b c d =3D Printf.printf "%-16s  %-15s  %-39s  %=
-20s\n" a b c d
  =E2=94=82=20
  =E2=94=82 let print_instance instance =3D
  =E2=94=82   let name =3D
  =E2=94=82     Option.bind instance.Ec2.Instance.tags (fun tags ->
  =E2=94=82       List.find_map
  =E2=94=82         (function
  =E2=94=82           | { Ec2.Tag.key =3D Some "Name"; value =3D Some v } -=
> Some v
  =E2=94=82           | _ -> None)
  =E2=94=82         tags)
  =E2=94=82   in
  =E2=94=82   let instance_type =3D
  =E2=94=82     match instance.instanceType with
  =E2=94=82     | Some it -> Ec2.InstanceType.to_string it
  =E2=94=82     | None -> ""
  =E2=94=82   in
  =E2=94=82   print_row
  =E2=94=82     instance_type
  =E2=94=82     (Option.value instance.publicIpAddress ~default:"")
  =E2=94=82     (Option.value instance.ipv6Address ~default:"")
  =E2=94=82     (Option.value name ~default:"")
  =E2=94=82 ;;
  =E2=94=82=20
  =E2=94=82 let main env =3D
  =E2=94=82   let cfg =3D Awso_eio.Cfg.get_exn ~env () in
  =E2=94=82   match Ec2.describe_instances ~cfg (Ec2.DescribeInstancesReque=
st.make ()) with
  =E2=94=82   | Error e ->
  =E2=94=82     failwith
  =E2=94=82       (Printf.sprintf
  =E2=94=82          "Ec2.describe_instances: %s"
  =E2=94=82          (Yojson.Safe.to_string (Ec2.Ec2_error.to_json e)))
  =E2=94=82   | Ok { reservations; _ } -> (
  =E2=94=82     let instances =3D
  =E2=94=82       reservations
  =E2=94=82       |> Option.value ~default:[]
  =E2=94=82       |> List.concat_map (function
  =E2=94=82         | { Ec2.Reservation.instances =3D None; _ } -> []
  =E2=94=82         | { instances =3D Some instances; _ } -> instances)
  =E2=94=82     in
  =E2=94=82     match instances with
  =E2=94=82     | [] -> print_endline "no instances"
  =E2=94=82     | instances ->
  =E2=94=82       print_row "instance-type" "public ipv4" "public ipv6" "na=
me";
  =E2=94=82       print_row
  =E2=94=82         (String.make 16 '-')
  =E2=94=82         (String.make 15 '-')
  =E2=94=82         (String.make 39 '-')
  =E2=94=82         (String.make 20 '-');
  =E2=94=82       List.iter print_instance instances)
  =E2=94=82 ;;
  =E2=94=82=20
  =E2=94=82 let () =3D Eio_main.run main
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80


Major changes in the fork from awsm
=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=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=80=A2 Replaced lightweight higher-kinded polymorphism with a functori=
zed
    approach (architectural detail: end users don't need to use
    functors!)
  =E2=80=A2 Restructured into `aws/{eio,async,lwt,sync}/' so each backend s=
hips
    only what it needs
  =E2=80=A2 Consolidated per-service opam packages into sub-libraries under=
 each
    backend, on advice from the opam-repository crew. opam install
    awso-async pulls in every service binding as awso-async.
  =E2=80=A2 Transport errors now raise instead of polluting the Result type;
    only AWS-side errors stay in Result, matching Async convention
  =E2=80=A2 Dropped Jane Street Core from the non-Async runtimes via a small
    Jane_compat shim; Yojson.Safe.t everywhere instead of ad-hoc JSON;
    Base is still required for some rewriters and other tooling, but
    still much lighter weight than all of Core
  =E2=80=A2 Codegen is committed to the tree, so `opam install' doesn't drag
    \~25 build-time packages into your dependency cone
  =E2=80=A2 Output shapes treat required as advisory, because AWS itself
    routinely omits fields it marks required (looking at you,
    AccessDeniedException with no Message). Input shapes still respect
    it.
  =E2=80=A2 Various [working examples here]

  Minimum OCaml 5.3.0 to install from opam, OCaml 4.14 if you bump your
  stack limit before building.

  See CHANGES.md for the full list, and TODO.md for things known to
  still be rough.


[working examples here]
<https://github.com/mbacarella/ocaml-awso/tree/main/examples>


A bit of history
=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

  OCaml's AWS bindings have a lineage that predates this fork by years,
  with substantial development at Solvuu and collaboration from
  Tarides. Special thanks to Jane Street for their contributions along
  the way. It was open-sourced a while back and has sat quietly since.

  `awso' is an attempt to dust it off, bring it forward to current
  OCaml, and give it a home where the community can utilize it. Genuine
  thanks to everyone whose work this builds on! There's a lot of good
  engineering under the hood that deserves to keep running.


Help me get the credits right
=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=E2=95=8C=E2=95=8C=E2=95=8C

  The code in the public solvuu repo was copy/pasted over from an
  internal repository, so the public git history doesn't reflect
  everyone who contributed. If you worked on any earlier version and
  want to be credited, please reach out.


Where it's going
=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.9.1 is meant as a release-candidate-quality baseline ahead of a
  1.0.0. Near-term: working through TODO.md and more working
  examples. Issues and PRs welcome, particularly bug reports from real
  workloads.

  It works on 4.14 but you need to increase your stack size a bit to
  work around some non-TCO parts of the OCaml compiler. I'm trying to
  see if we can chunk things up differently to get it through opam-ci
  for OCaml 4.14.

  =E2=80=A2 Repo: <https://github.com/mbacarella/ocaml-awso>
  =E2=80=A2 opam: opam install awso-eio (or -lwt, or -async, or -sync)

  Bear with me while I spin some things in TODO.md off into GitHub
  issues. But I'm also curious to hear what might be missing from this
  release for you.


AI assistance disclosure
=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

  Most of this work is directly coded by multiple humans over several
  years. A bulk of my own work in the project was back in 2022 porting
  it to ppxlib, making it work in OCaml 5 and growing the supported
  services from a handful to hundreds (bugfixes, missing support,
  working around botocore spec errors). Most of this work happened
  before the age of LLMs. Remember when "generated code" meant
  /generated by OCaml/? This guy remembers.

  I've since recruited Claude Code with Opus 4.7 for the push towards an
  opam release: mostly in refactoring, catching up on the latest
  botocore spec, and reducing the dependency cone. I hereby declare I
  understand and can answer for every line of code in awso.


Closing
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  I'm happy to hear feedback, especially on API ergonomics.

  <3 Michael


OCaml 4.14.3 for Plan 9
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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/ocaml-4-14-3-for-plan-9/18223/1>


Eduardo Cavazos 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 y'all =F0=9F=99=8B=E2=80=8D=E2=99=82=EF=B8=8F

  I've been messing around with a port of OCaml 4.14.3 for Plan 9:

  <https://github.com/dharmatech/ocaml>

  The native compiler isn't supported yet. Just bytecode support, repl,
  etc.

  <https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/0/0b5d1d=
bf8b4ae9b3918143a6a790d19f422280bf.png>


Call for Talk Proposals @ OCaml Workshop 2026
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=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/call-for-talk-proposals-ocaml-workshop-2026/=
18192/2>


Continuing this thread, Sudha Parimala 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

  The website is now live at
  <https://ocaml.org/ocaml-workshop-2026>. Please refer to it for the
  latest information!

  The submission deadline is roughly three weeks away! Please consider
  submitting your work.


Ahrefs Grant Program for OCaml
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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/ahrefs-grant-program-for-ocaml/17604/5>


Continuing this thread, Louis Roch=C3=A9 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

  The recipient of the grants are:

  =E2=80=A2 [OCaml bindings for GTK 4] by Chris Armstrong
  =E2=80=A2 [LSP for menhir] by Federico Dal Pio Luogo
  =E2=80=A2 [Programmable Patterns for OCaml] by the team of Ningning Xie i=
n the
    University of Toronto
  =E2=80=A2 [Update the WebAuthn OCaml library to specification level 3 from
    level 2 (2021)] by Robur
  =E2=80=A2 [Modernizing ocp-indent for OCaml 5.x] by ocamlpro
  =E2=80=A2 [Maintenance and Development of the Dream Web Framework] by
    Sebastian Willenbrink,
  =E2=80=A2 Introspectable OCaml, an OCaml variant (compile-time options) w=
hich
    provides an improved debugging and profiling experience, by
    [Shogan.ai] (Frederic Bour and Thomas Refis)


[OCaml bindings for GTK 4] <https://github.com/chris-armstrong/ocgtk>

[LSP for menhir] <https://github.com/dalps/menhir-lsp>

[Programmable Patterns for OCaml]
<https://github.com/ocaml/ocaml/issues/14627>

[Update the WebAuthn OCaml library to specification level 3 from level 2
(2021)] <https://github.com/robur-coop/webauthn/>

[Modernizing ocp-indent for OCaml 5.x]
<https://github.com/OCamlPro/ocp-indent>

[Maintenance and Development of the Dream Web Framework]
<https://github.com/camlworks/dream>

[Shogan.ai] <http://Shogan.ai>


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-06-09 Tue 09:37 -->
<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.06.02.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.06.16.html">Next Week</a>
</p>

<p>
Hello
</p>

<p>
Here is the latest OCaml Weekly News, for the week of June 02 to 09, 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">Richard Bird Distinguished Dissertation Award</a></li>
<li><a href=3D"#2">Announcing Pyro Caml: A Continuous Profiler for OCaml</a=
></li>
<li><a href=3D"#3">awso 0.9.1: Type-safe coverage for 400+ AWS APIs</a></li>
<li><a href=3D"#4">OCaml 4.14.3 for Plan 9</a></li>
<li><a href=3D"#5">Call for Talk Proposals @ OCaml Workshop 2026</a></li>
<li><a href=3D"#6">Ahrefs Grant Program for OCaml</a></li>
<li><a href=3D"#org5d5bb8b">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Richard Bird Distinguished Dissertation Award</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/richard-bird-distinguished-=
dissertation-award/18215/1">https://discuss.ocaml.org/t/richard-bird-distin=
guished-dissertation-award/18215/1</a>
</p>
</div>
<div id=3D"outline-container-orga0672b4" class=3D"outline-3">
<h3 id=3D"orga0672b4">Fran=C3=A7ois Pottier announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga0672b4">
<p>
Hello fellow users of OCaml,
If you or your students have defended a PhD in 2025 on a topic related to f=
unctional programming, then you may apply for the (new) Richard Bird Distin=
guished Dissertation Award. Announcement copied below.
</p>

<p>
<code>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</code>
</p>

<p>
CALL FOR NOMINATIONS
</p>

<p>
Richard Bird Distinguished Dissertation Award 2025
</p>

<p>
Deadline: 31st August 2026
</p>

<p>
<a href=3D"http://tinyurl.com/jfp-bird-award">http://tinyurl.com/jfp-bird-a=
ward</a>
</p>

<p>
<code>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</code>
</p>

<p>
OVERVIEW
</p>

<p>
The Journal of Functional Programming is pleased to establish
the Richard Bird Distinguished Dissertation Award, to recognise
an outstanding PhD dissertation in functional programming.
</p>

<p>
Richard Bird (1943-2022) was one of the leading figures in
functional programming.  He was a Professor in Oxford, where
he founded the Algebra of Programming group, and served as
Director of the Computing Laboratory.  Richard is renowned
for his many books and pearls on functional programming,
which set a lasting standard for clear and elegant writing.
It seems fitting that an award be established in his name
to further encourage these values in the field.
</p>

<p>
The award includes a prize of =C2=A31,000.  Funding for the prize
is supported by a generous donation from Richard himself to
further the cause of functional programming.
</p>

<p>
CRITERIA
</p>

<p>
Eligible dissertations must have been completed in 2025.
Depending on the institution, this may be the date of the viva,
corrections being approved, graduation ceremony, or otherwise.
</p>

<p>
The award is open to all topics within the remit of JFP, with
a particular emphasis on dissertations that reflect Richard's
own values of clarity, simplicity and elegance.  For a
dissertation to be considered for the award it should:
</p>

<ul class=3D"org-ul">
<li>Reach a high standard of exposition;</li>

<li>Make a noteworthy contribution to the subject;</li>

<li>Place the results in the wider context of computer science.</li>
</ul>

<p>
NOMINATIONS
</p>

<p>
Please submit the following information to the award chair,
[email protected], by 31st August 2026:
</p>

<ul class=3D"org-ul">
<li>Two letters of support, explaining why the dissertation
should be considered for the award.  One letter should be
from the advisor/supervisor, and one from an independent
source with no conflict of interest with the candidate,
such as an external examiner or other expert in the field.</li>

<li>A copy of the dissertation itself.</li>
</ul>

<p>
AWARD COMMITTEE
</p>

<ul class=3D"org-ul">
<li>Graham Hutton (chair), University of Nottingham</li>
<li>Matthew Flatt, University of Utah</li>
<li>Jeremy Gibbons, University of Oxford</li>
<li>Fran=C3=A7ois Pottier, INRIA</li>
<li>Wouter Swierstra, University of Utrecht</li>
<li>Ningning Xie, University of Toronto</li>
</ul>

<p>
The JFP editors-in-chief serve as observers of the committee.
</p>

<p>
<code>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</code>
</p>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Announcing Pyro Caml: A Continuous Profiler for OCaml</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/announcing-pyro-caml-a-cont=
inuous-profiler-for-ocaml/18217/1">https://discuss.ocaml.org/t/announcing-p=
yro-caml-a-continuous-profiler-for-ocaml/18217/1</a>
</p>
</div>
<div id=3D"outline-container-org65e0b5e" class=3D"outline-3">
<h3 id=3D"org65e0b5e">Austin Theriault announced</h3>
<div class=3D"outline-text-3" id=3D"text-org65e0b5e">
<p>
Hey y'all, last year I gave a <a href=3D"https://fun-ocaml.com/2025/ocaml-o=
bservability-with-opentelemetry/">workshop</a> on observability at Fun OCam=
l, and a few folks asked me what was available for continuous profiling, an=
d I wasn't aware of any solutions that supported OCaml directly.=20
</p>

<p>
Since then I got the opportunity to work on one, and put it into use in pro=
duction over at Semgrep, and now after battle testing it for a few months I=
'm happy to announce <a href=3D"https://github.com/semgrep/pyro-caml">Pyro =
Caml</a> is now available, and on <a href=3D"https://opam.ocaml.org/package=
s/pyro-caml/">opam</a>.
</p>

<p>
I got a good excuse to use a lot of cool OCaml tools like ocaml-rs, the run=
time event system, and memprof, so needless to say it was a bunch of fun to=
 write this :slight_smile: . If you're interested in the details I have a b=
log post <a href=3D"https://semgrep.dev/blog/2026/announcing-pyro-caml-cont=
inuous-profiler-ocaml/">here</a> covering them.
</p>

<p>
Currently it only supports CPU profiling, but we're potentially going to ad=
d memory/gc profiling in the coming months. Enjoy!
</p>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">awso 0.9.1: Type-safe coverage for 400+ AWS APIs</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-awso-0-9-1-type-safe-co=
verage-for-400-aws-apis/18220/1">https://discuss.ocaml.org/t/ann-awso-0-9-1=
-type-safe-coverage-for-400-aws-apis/18220/1</a>
</p>
</div>
<div id=3D"outline-container-org3fda254" class=3D"outline-3">
<h3 id=3D"org3fda254">Michael Bacarella announced</h3>
<div class=3D"outline-text-3" id=3D"text-org3fda254">
<p>
Greetings OCaml enjoyers,
</p>

<p>
Have you been annoyed with terraform plan telling you 10 minutes later that=
 you have a typo? Are you frustrated with how type-ambiguous your cloud is?=
 (Abe Simpson shaking fist at cloud)
</p>

<p>
Or, maybe you wish you could have AWS libraries inside an ecosystem you tru=
st.
</p>

<p>
Well, this release is for you!
</p>

<p>
I'm happy to announce <code>awso</code>, a comprehensive AWS library. This =
was forked from <code>https://github.com/solvuu/awsm</code>, which was neve=
r released to opam. <code>awso</code> provides typed OCaml bindings to AWS =
services generated from botocore's service definitions, so the compiler cat=
ches the typos and shape mismatches.
</p>

<p>
The <code>awso</code> repo: <a href=3D"https://github.com/mbacarella/ocaml-=
awso">https://github.com/mbacarella/ocaml-awso</a>
</p>
</div>
<div id=3D"outline-container-org0862f47" class=3D"outline-4">
<h4 id=3D"org0862f47">What's in the tin</h4>
<div class=3D"outline-text-4" id=3D"text-org0862f47">
<p>
Typed clients for the full AWS surface area, generated from botocore 1.43.9
</p>

<p>
Four I/O backends:
</p>

<ul class=3D"org-ul">
<li><code>awso-eio</code> - Eio</li>
<li><code>awso-async</code> &mdash; Async</li>
<li><code>awso-lwt</code> &mdash; Lwt</li>
<li><code>awso-sync</code> &mdash; Synchronous (blocking) over libcurl, for=
 easy scripting and CLIs</li>
</ul>

<p>
Also
</p>

<ul class=3D"org-ul">
<li><code>awso-cli</code>: for fun, a kitchen-sink binary exposing every se=
rvice as a composable subcommand, in the spirit of the Python aws CLI. (Shi=
ps as bytecode because linking \~400 native service libraries exceeds ARM64=
 executable size limits; yes really)</li>
</ul>

<p>
Note: the AWS API is big. <code>opam install</code> may take awhile.
</p>
</div>
</div>
<div id=3D"outline-container-org090cb6f" class=3D"outline-4">
<h4 id=3D"org090cb6f">An example using Eio</h4>
<div class=3D"outline-text-4" id=3D"text-org090cb6f">
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #8f6f4a; font-styl=
e: italic;">(* </span><span style=3D"color: #8f6f4a; font-style: italic;">e=
c2_describe_instances.ml</span><span style=3D"color: #8f6f4a; font-style: i=
talic;"> *)</span>
<span style=3D"color: #242521; font-weight: bold;">module</span> <span styl=
e=3D"color: #557400; font-weight: bold;">Ec2</span> =3D <span style=3D"colo=
r: #557400; font-weight: bold;">Awso_ec2_eio</span>

<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">print_row</span> <span style=3D"color: #007a9f;">a</sp=
an> <span style=3D"color: #007a9f;">b</span> <span style=3D"color: #007a9f;=
">c</span> <span style=3D"color: #007a9f;">d</span> =3D <span style=3D"colo=
r: #557400; font-weight: bold;">Printf.</span>printf <span style=3D"color: =
#ca3400;">"%-16s  %-15s  %-39s  %-20s\n"</span> a b c d

<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">print_instance</span> <span style=3D"color: #007a9f;">=
instance</span> =3D
  <span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">name</span> =3D
    <span style=3D"color: #557400; font-weight: bold;">Option.</span>bind i=
nstance.<span style=3D"color: #557400; font-weight: bold;">Ec2.Instance.</s=
pan>tags (<span style=3D"color: #006f00; font-weight: bold;">fun</span> <sp=
an style=3D"color: #007a9f;">tags</span> -&gt;
      <span style=3D"color: #557400; font-weight: bold;">List.</span>find_m=
ap
        (<span style=3D"color: #006f00; font-weight: bold;">function</span>
          | { <span style=3D"color: #557400; font-weight: bold;">Ec2.Tag.</=
span>key =3D <span style=3D"color: #242521;">Some</span> <span style=3D"col=
or: #ca3400;">"Name"</span>; value =3D <span style=3D"color: #242521;">Some=
</span> v } -&gt; <span style=3D"color: #242521;">Some</span> v
          | _ -&gt; <span style=3D"color: #242521;">None</span>)
        tags)
  <span style=3D"color: #242521; font-weight: bold;">in</span>
  <span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">instance_type</span> =3D
    <span style=3D"color: #006f00; font-weight: bold;">match</span> instanc=
e.instanceType <span style=3D"color: #006f00; font-weight: bold;">with</spa=
n>
    | <span style=3D"color: #242521;">Some</span> it -&gt; <span style=3D"c=
olor: #557400; font-weight: bold;">Ec2.InstanceType.</span>to_string it
    | <span style=3D"color: #242521;">None</span> -&gt; <span style=3D"colo=
r: #ca3400;">""</span>
  <span style=3D"color: #242521; font-weight: bold;">in</span>
  print_row
    instance_type
    (<span style=3D"color: #557400; font-weight: bold;">Option.</span>value=
 instance.publicIpAddress <span style=3D"color: #444fcf; font-weight: bold;=
">~default</span>:<span style=3D"color: #ca3400;">""</span>)
    (<span style=3D"color: #557400; font-weight: bold;">Option.</span>value=
 instance.ipv6Address <span style=3D"color: #444fcf; font-weight: bold;">~d=
efault</span>:<span style=3D"color: #ca3400;">""</span>)
    (<span style=3D"color: #557400; font-weight: bold;">Option.</span>value=
 name <span style=3D"color: #444fcf; font-weight: bold;">~default</span>:<s=
pan style=3D"color: #ca3400;">""</span>)
<span style=3D"color: #9f0d0f;">;;</span>

<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">main</span> <span style=3D"color: #007a9f;">env</span>=
 =3D
  <span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">cfg</span> =3D <span style=3D"color: #557400; font-wei=
ght: bold;">Awso_eio.Cfg.</span>get_exn ~env () <span style=3D"color: #2425=
21; font-weight: bold;">in</span>
  <span style=3D"color: #006f00; font-weight: bold;">match</span> <span sty=
le=3D"color: #557400; font-weight: bold;">Ec2.</span>describe_instances ~cf=
g (<span style=3D"color: #557400; font-weight: bold;">Ec2.DescribeInstances=
Request.</span>make ()) <span style=3D"color: #006f00; font-weight: bold;">=
with</span>
  | <span style=3D"color: #242521;">Error</span> e -&gt;
    <span style=3D"color: #557400; font-weight: bold;">failwith</span>
      (<span style=3D"color: #557400; font-weight: bold;">Printf.</span>spr=
intf
         <span style=3D"color: #ca3400;">"Ec2.describe_instances: %s"</span>
         (<span style=3D"color: #557400; font-weight: bold;">Yojson.Safe.</=
span>to_string (<span style=3D"color: #557400; font-weight: bold;">Ec2.Ec2_=
error.</span>to_json e)))
  | <span style=3D"color: #242521;">Ok</span> { reservations; _ } -&gt; (
    <span style=3D"color: #242521; font-weight: bold;">let</span> <span sty=
le=3D"color: #007a9f;">instances</span> =3D
      reservations
      <span style=3D"color: #9f0d0f;">|&gt;</span> <span style=3D"color: #5=
57400; font-weight: bold;">Option.</span>value <span style=3D"color: #444fc=
f; font-weight: bold;">~default</span>:<span style=3D"color: #242521;">[]</=
span>
      <span style=3D"color: #9f0d0f;">|&gt;</span> <span style=3D"color: #5=
57400; font-weight: bold;">List.</span>concat_map (<span style=3D"color: #0=
06f00; font-weight: bold;">function</span>
        | { <span style=3D"color: #557400; font-weight: bold;">Ec2.Reservat=
ion.</span>instances =3D <span style=3D"color: #242521;">None</span>; _ } -=
&gt; <span style=3D"color: #242521;">[]</span>
        | { instances =3D <span style=3D"color: #242521;">Some</span> insta=
nces; _ } -&gt; instances)
    <span style=3D"color: #242521; font-weight: bold;">in</span>
    <span style=3D"color: #006f00; font-weight: bold;">match</span> instanc=
es <span style=3D"color: #006f00; font-weight: bold;">with</span>
    | <span style=3D"color: #242521;">[]</span> -&gt; print_endline <span s=
tyle=3D"color: #ca3400;">"no instances"</span>
    | instances -&gt;
      print_row <span style=3D"color: #ca3400;">"instance-type"</span> <spa=
n style=3D"color: #ca3400;">"public ipv4"</span> <span style=3D"color: #ca3=
400;">"public ipv6"</span> <span style=3D"color: #ca3400;">"name"</span>;
      print_row
        (<span style=3D"color: #557400; font-weight: bold;">String.</span>m=
ake 16 <span style=3D"color: #ca3400;">'-'</span>)
        (<span style=3D"color: #557400; font-weight: bold;">String.</span>m=
ake 15 <span style=3D"color: #ca3400;">'-'</span>)
        (<span style=3D"color: #557400; font-weight: bold;">String.</span>m=
ake 39 <span style=3D"color: #ca3400;">'-'</span>)
        (<span style=3D"color: #557400; font-weight: bold;">String.</span>m=
ake 20 <span style=3D"color: #ca3400;">'-'</span>);
      <span style=3D"color: #557400; font-weight: bold;">List.</span>iter p=
rint_instance instances)
<span style=3D"color: #9f0d0f;">;;</span>

<span style=3D"color: #242521; font-weight: bold;">let</span> () =3D <span =
style=3D"color: #557400; font-weight: bold;">Eio_main.</span>run main
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-org9db5bea" class=3D"outline-4">
<h4 id=3D"org9db5bea">Major changes in the fork from awsm</h4>
<div class=3D"outline-text-4" id=3D"text-org9db5bea">
<ul class=3D"org-ul">
<li>Replaced lightweight higher-kinded polymorphism with a functorized appr=
oach (architectural detail: end users don't need to use functors!)</li>
<li>Restructured into <code>aws/{eio,async,lwt,sync}/</code> so each backen=
d ships only what it needs</li>
<li>Consolidated per-service opam packages into sub-libraries under each ba=
ckend, on advice from the opam-repository crew. opam install awso-async pul=
ls in every service binding as awso-async.</li>
<li>Transport errors now raise instead of polluting the Result type; only A=
WS-side errors stay in Result, matching Async convention</li>
<li>Dropped Jane Street Core from the non-Async runtimes via a small Jane_c=
ompat shim; Yojson.Safe.t everywhere instead of ad-hoc JSON; Base is still =
required for some rewriters and other tooling, but still much lighter weigh=
t than all of Core</li>
<li>Codegen is committed to the tree, so <code>opam install</code> doesn't =
drag \~25 build-time packages into your dependency cone</li>
<li>Output shapes treat required as advisory, because AWS itself routinely =
omits fields it marks required (looking at you, AccessDeniedException with =
no Message). Input shapes still respect it.</li>
<li>Various <a href=3D"https://github.com/mbacarella/ocaml-awso/tree/main/e=
xamples">working examples here</a></li>
</ul>

<p>
Minimum OCaml 5.3.0 to install from opam, OCaml 4.14 if you bump your stack=
 limit before building.
</p>

<p>
See CHANGES.md for the full list, and TODO.md for things known to still be =
rough.
</p>
</div>
</div>
<div id=3D"outline-container-org008d647" class=3D"outline-4">
<h4 id=3D"org008d647">A bit of history</h4>
<div class=3D"outline-text-4" id=3D"text-org008d647">
<p>
OCaml's AWS bindings have a lineage that predates this fork by years, with =
substantial development at Solvuu and collaboration from Tarides. Special t=
hanks to Jane Street for their contributions along the way. It was open-sou=
rced a while back and has sat quietly since.
</p>

<p>
<code>awso</code> is an attempt to dust it off, bring it forward to current=
 OCaml, and give it a home where the community can utilize it. Genuine than=
ks to everyone whose work this builds on! There's a lot of good engineering=
 under the hood that deserves to keep running.
</p>
</div>
</div>
<div id=3D"outline-container-org93ea68f" class=3D"outline-4">
<h4 id=3D"org93ea68f">Help me get the credits right</h4>
<div class=3D"outline-text-4" id=3D"text-org93ea68f">
<p>
The code in the public solvuu repo was copy/pasted over from an internal re=
pository, so the public git history doesn't reflect everyone who contribute=
d. If you worked on any earlier version and want to be credited, please rea=
ch out.
</p>
</div>
</div>
<div id=3D"outline-container-org09bdbd9" class=3D"outline-4">
<h4 id=3D"org09bdbd9">Where it's going</h4>
<div class=3D"outline-text-4" id=3D"text-org09bdbd9">
<p>
0.9.1 is meant as a release-candidate-quality baseline ahead of a 1.0.0. Ne=
ar-term: working through TODO.md and more working examples. Issues and PRs =
welcome, particularly bug reports from real workloads.
</p>

<p>
It works on 4.14 but you need to increase your stack size a bit to work aro=
und some non-TCO parts of the OCaml compiler. I'm trying to see if we can c=
hunk things up differently to get it through opam-ci for OCaml 4.14.
</p>

<ul class=3D"org-ul">
<li>Repo: <a href=3D"https://github.com/mbacarella/ocaml-awso">https://gith=
ub.com/mbacarella/ocaml-awso</a></li>
<li>opam: opam install awso-eio (or -lwt, or -async, or -sync)</li>
</ul>

<p>
Bear with me while I spin some things in TODO.md off into GitHub issues. Bu=
t I'm also curious to hear what might be missing from this release for you.
</p>
</div>
</div>
<div id=3D"outline-container-org474491f" class=3D"outline-4">
<h4 id=3D"org474491f">AI assistance disclosure</h4>
<div class=3D"outline-text-4" id=3D"text-org474491f">
<p>
Most of this work is directly coded by multiple humans over several years. =
A bulk of my own work in the project was back in 2022 porting it to ppxlib,=
 making it work in OCaml 5 and growing the supported services from a handfu=
l to hundreds (bugfixes, missing support, working around botocore spec erro=
rs). Most of this work happened before the age of LLMs. Remember when "gene=
rated code" meant <i>generated by OCaml</i>? This guy remembers.
</p>

<p>
I've since recruited Claude Code with Opus 4.7 for the push towards an opam=
 release: mostly in refactoring, catching up on the latest botocore spec, a=
nd reducing the dependency cone. I hereby declare I understand and can answ=
er for every line of code in awso.
</p>
</div>
</div>
<div id=3D"outline-container-orge73b9bc" class=3D"outline-4">
<h4 id=3D"orge73b9bc">Closing</h4>
<div class=3D"outline-text-4" id=3D"text-orge73b9bc">
<p>
I'm happy to hear feedback, especially on API ergonomics.
</p>

<p>
&lt;3 Michael
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">OCaml 4.14.3 for Plan 9</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-4-14-3-for-plan-9/182=
23/1">https://discuss.ocaml.org/t/ocaml-4-14-3-for-plan-9/18223/1</a>
</p>
</div>
<div id=3D"outline-container-orge5b3f2c" class=3D"outline-3">
<h3 id=3D"orge5b3f2c">Eduardo Cavazos announced</h3>
<div class=3D"outline-text-3" id=3D"text-orge5b3f2c">
<p>
Hey y'all =F0=9F=99=8B=E2=80=8D=E2=99=82=EF=B8=8F
</p>

<p>
I've been messing around with a port of OCaml 4.14.3 for Plan 9:
</p>

<p>
<a href=3D"https://github.com/dharmatech/ocaml">https://github.com/dharmate=
ch/ocaml</a>
</p>

<p>
The native compiler isn't supported yet. Just bytecode support, repl, etc.
</p>


<div id=3D"org32db1d0" class=3D"figure">
<p><img src=3D"https://us1.discourse-cdn.com/flex020/uploads/ocaml/original=
/2X/0/0b5d1dbf8b4ae9b3918143a6a790d19f422280bf.png" alt=3D"0b5d1dbf8b4ae9b3=
918143a6a790d19f422280bf.png" width=3D"80%" />
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Call for Talk Proposals @ OCaml Workshop 2026</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/call-for-talk-proposals-oca=
ml-workshop-2026/18192/2">https://discuss.ocaml.org/t/call-for-talk-proposa=
ls-ocaml-workshop-2026/18192/2</a>
</p>
</div>
<div id=3D"outline-container-orgbad4bc7" class=3D"outline-3">
<h3 id=3D"orgbad4bc7">Continuing this thread, Sudha Parimala announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgbad4bc7">
<p>
The website is now live at <a href=3D"https://ocaml.org/ocaml-workshop-2026=
">https://ocaml.org/ocaml-workshop-2026</a>. Please refer to it for the lat=
est information!
</p>

<p>
The submission deadline is roughly three weeks away! Please consider submit=
ting your work.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">Ahrefs Grant Program for OCaml</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ahrefs-grant-program-for-oc=
aml/17604/5">https://discuss.ocaml.org/t/ahrefs-grant-program-for-ocaml/176=
04/5</a>
</p>
</div>
<div id=3D"outline-container-orgb367e6d" class=3D"outline-3">
<h3 id=3D"orgb367e6d">Continuing this thread, Louis Roch=C3=A9 announced</h=
3>
<div class=3D"outline-text-3" id=3D"text-orgb367e6d">
<p>
The recipient of the grants are:
</p>

<ul class=3D"org-ul">
<li><a href=3D"https://github.com/chris-armstrong/ocgtk">OCaml bindings for=
 GTK 4</a> by Chris Armstrong</li>
<li><a href=3D"https://github.com/dalps/menhir-lsp">LSP for menhir</a> by F=
ederico Dal Pio Luogo</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14627">Programmable Pa=
tterns for OCaml</a> by the team of Ningning Xie in the University of Toron=
to</li>
<li><a href=3D"https://github.com/robur-coop/webauthn/">Update the WebAuthn=
 OCaml library to specification level 3 from level 2 (2021)</a> by Robur</l=
i>
<li><a href=3D"https://github.com/OCamlPro/ocp-indent">Modernizing ocp-inde=
nt for OCaml 5.x</a> by ocamlpro</li>
<li><a href=3D"https://github.com/camlworks/dream">Maintenance and Developm=
ent of the Dream Web Framework</a> by Sebastian Willenbrink,</li>
<li>Introspectable OCaml, an OCaml variant (compile-time options) which pro=
vides an improved debugging and profiling experience, by <a href=3D"http://=
shogan.ai">Shogan.ai</a> (Frederic Bour and Thomas Refis)</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-org5d5bb8b" class=3D"outline-2">
<h2 id=3D"org5d5bb8b">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org5d5bb8b">
<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"org7f77351">
<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/BsSVW56ZmGBA0KO07S5ccFAmonwx4bFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5cdBrwgAtq1DBo6LmU9cvPd2a2t+y33DxVflTx8QgqW5KsMV
7Gemi8n2zbAkoGY7+dDMKAtXVg+LChdimoTF3M0yuapej+xH3AOxR4litTBwBJ2R
0/bPhsYT57Uh5Kuarel/WiBVHq5gF9pZLZH//kPbbu9EmA1/7JG/A+8RM4t+FjPd
SOLBQo3yWcC3gH94xwTRxmOISzyllnr01/+JIiy2SevWavoM2GcP2jSGqW5w5oCW
v3bITGsHNC4fUYSmLuTBlcIKYUVYrP8ZDlos257RA470ReBd92yduygcZqOd6dOA
u5HtYg9pd+mOEWFfnzbXdu7A/iS3LTmopF67ug6OOXU5ig==
=g6oq
-----END PGP SIGNATURE-----
--===-=-=--