From: Alan Schmitt <alan.schmitt@polytechnique.org>
To: "lwn" <lwn@lwn.net>, caml-list@inria.fr
Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News
Date: Tue, 01 Sep 2026 11:14:28 +0200 [thread overview]
Message-ID: <m2y0dl1ggb.fsf@petitepomme.net> (raw)
[-- Attachment #1.1.1: Type: text/plain, Size: 35497 bytes --]
Hello
Here is the latest OCaml Weekly News, for the week of August 25 to
September 01, 2026.
Table of Contents
─────────────────
Unhandled: a static checker for unhandled effects in OCaml 5, and a negative result
The series of mirage-crypto* releases
Rpmfile 1.0.0 and Bytream 0.2
oxbow, a dynamic tiling window manager for the Wayland compositor River
cdp 0.1.0 - typed Chrome DevTools Protocol libraries for OCaml
Hardcaml Networking Library - Toy Project
FUN OCaml 2027 in Bangalore, Jan 25-26 - Time to Send Talk and Workshop Proposals - Until Sep 30
ease-caml - Easing library for OCaml
opam 2.6.0~alpha1
Old CWN
Unhandled: a static checker for unhandled effects in OCaml 5, and a negative result
═══════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/unhandled-a-static-checker-for-unhandled-effects-in-ocaml-5-and-a-negative-result/18474/1>
Manish Paul announced
─────────────────────
OCaml 5's effect handlers are untyped: the compiler does not check
that a performed effect is handled, so a missing handler compiles
cleanly and fails at run time with `Effect.Unhandled'. We have been
building a static checker for that, and we would like some criticism
of it, particularly of the parts we think are weakest.
*What it does.* It reads the compiler's own `.cmt' files, infers a
per-function effect set, propagates by call-graph fixpoint, subtracts
effects discharged at handler sites, and reports every `perform' that
can reach a program entry point unhandled. Findings come with a blame
path from entry to `perform', and with a generated witness program: we
synthesise it, compile it, run it, and only report the finding as
confirmed if the effect actually arrives at an outer boundary.
*How it is tested.* Differential testing against the runtime as
oracle: a generator emits programs, and we compare the checker's
prediction against what the compiled program actually does when
executed. Over 1000 generated programs, 0 false negatives. Branch-free
programs: 600, no false positives. Branching programs: 400, 5.3%
false positives, from joining both arms of a conditional. The
witnesses deliberately do not parse the crash message. Handy, since
5.4 stopped printing the effect payload for two of our test programs
and nothing broke.
*The negative result, which is the reason for this post.* We wanted to
show the checker catches crashes that really happened, so we built a
corpus of commits that fixed documented `Effect.Unhandled' problems
and analysed each parent commit. It caught 0 of 6. The cause turned
out to be that the modules the bugs lived in never compiled in our
environment, so the analyser was never shown the code. The batch
runner now reports "out of scope" separately from "missed" for exactly
this reason.
Then we ran it across every opam package depending on `eio',
`eio_main', `picos', `domainslib', `riot', `moonpool' or `miou',
giving 85 repositories after deduplicating by `dev-repo'. 38 of them
built far enough to analyse, 3,881 modules in total, and the tool
reported *31 escapes. Every single one was our own false positive.*
Four causes, each found by reading the code we had accused:
1. We modelled "calls anything under `Eio.'" as "requires an Eio
runtime". Wrong for constructors and vtable builders:
`Eio.Flow.Pi.source', `Eio.Stream.create', `Eio.Condition.create',
`Eio.Buf_read.parse_string_exn'.
2. We applied that client-usage model to eio's *own* source, which is
a category error. eio does not need an Eio runtime to define
itself.
3. We did not see through application operators. `let@ env =
Eio_main.run in body' is `( let@ ) Eio_main.run (fun env ->
body)', and with the operator opaque the head of that
application is not `Eio_main.run', so the scheduler boundary
vanished and an entire program looked like it ran with no
runtime. The fix is to read `%apply' and `%revapply' out of the
value description, which would also cover `@@', `|>', and
operators a project defines for itself.
4. We only recognised an `Effect.Unhandled' guard when it named the
exception. picos writes it as a catch-all and says why:
┌────
│ | exception _exn ->
│ (* This should only happen when not running under a scheduler.
│ However, we don't match on a specific exception, because it
│ depends on the OCaml version. *)
└────
We had recorded the same observation independently, and then
watched 5.4 stop printing the effect payload, which is the same
problem from the other side.
Causes 1 and 2 are fixed and regression-tested in both
directions. Causes 3 and 4 are diagnosed but not yet fixed: the
attempt broke the test suite and we reverted it rather than ship a red
one, so they are written up in `docs/LIMITATIONS.md' with the forester
and picos source that produced them. Twenty-five escapes fixed, six
remaining and explained.
*Every escape this tool has ever reported on third-party code has
turned out to be our own false positive. We have not found a real bug
in anyone's code.* We would rather say that plainly than imply
otherwise.
If there is a transferable lesson it is probably that one: a checker
pointed at real code for the first time is mostly measuring itself,
and the only way to tell the difference is to read the source you just
accused.
*What we would like criticism of.*
• Is the library-contract output useful to you? On picos it produces:
┌────
│ module Picos
│ Picos.Trigger.await may perform {Picos.Trigger.Await}
│ Picos.Fiber.current may perform {Picos.Fiber.Current}
│ Picos.Fiber.spawn may perform {Picos.Fiber.Spawn}
│ Picos.Fiber.yield may perform {Picos.Fiber.Yield}
│ Picos.Fiber.Maybe.to_fiber_or_current may perform {Picos.Fiber.Current}
│ Picos.Fiber.Maybe.or_current may perform {Picos.Fiber.Current}
│ Picos.Fiber.Maybe.current_if may perform {Picos.Fiber.Current}
│ Picos.Fiber.Maybe.current_and_check_if may perform {Picos.Fiber.Current, ...unknown}
│
│ module Picos_std_event__Event
│ Picos_std_event__Event.sync may perform {Picos.Trigger.Await, ...unknown}
│ Picos_std_event__Event.select may perform {Picos.Trigger.Await, ...unknown}
│
│ module Picos_std_structured__Run
│ Picos_std_structured__Run.spawn may perform {Picos.Fiber.Spawn, ...unknown}
└────
`...unknown' in a set means the contract is incomplete at that
function because it calls something we have no `.cmt' for; we would
rather show that than round it down to a clean-looking set.
Is a machine-checked statement of "what this library asks its
callers to handle" worth having in a README or in CI?
• What shapes do we miss? We know about effects performed inside
`effc' branch bodies, dynamically built handler records, and
closures that reach a call site through a data structure (no 0-CFA
yet). We would like to hear about the ones we do not know about.
• The scheduler model, meaning which entry point installs handlers for
which family of effects, is data rather than analysis, and lives in
`models/schedulers.conf'. The eio entries are cited to specific
lines. The riot, moonpool and miou entries are *guesses* and
labelled as such. Corrections very welcome.
• Has anyone actually hit an `Effect.Unhandled' crash in production?
We are short of real examples and would take any pointer, including
"we hit it and the cause was something your design cannot see".
Requires OCaml 5.3 or later, since `Texp_match' only grows its
effect-case list in 5.3. CI runs 5.3 and 5.4.
Repository: <https://github.com/manishpaulish/unhandled>
Happy to be told the approach is wrong.
The series of mirage-crypto* releases
═════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/the-series-of-mirage-crypto-releases/18476/1>
Hannes Mehnert announced
────────────────────────
Dear everyone,
it is my delight to release mirage-crypto* in version 2.4.1
(<https://github.com/ocaml/opam-repository/pull/30568>). There have
been a series of releases since late July with 2.2.0. The reasoning
behind is that several people used LLM to find some issues in the
implementation that we are fixing in the process. It is likely
there'll be more releases. We try to limit the releases we cut during
each month. Me as a maintainer of that package is as well at the edge
of what I can do (time-wise – please consider donating at
<https://robur.coop/#contact> or via GitHub spoinsors – in the case
you use this piece of software). Even more appreciated would be jump
in, read code, review pull requests when they come in, contribute code
cleanups (please don't submit your LLM generated improvements
directly, but do careful reviews of them). Especially since now
everyone is on the red team.
The performance of mirage-crypto has decreased due to added checks,
but only in a small margin as far as I can observe on hardware that I
use. Feel free to conduct your own benchmarks (there is bench/speed.ml
available), and propose improvements.
Now, the changes range between fixes and cleanups to has a published
advisory. There's not always a clear border. The full list can be
found in the CHANGES file, or in the commit history. I encourage
everyone to update to the latest release, and not use any previous
release. As mentioned, some advisories are out, and for other fixes we
think they may not need an advisory (although it may be that other
implementations issues advisories for such fixes, so please be careful
– you can as well submit PRs to ocaml/security-advisories if you think
some specific fixes are important enough to get an advisory).
The fixes in more detail follow. Thanks to Eric Ebinger, Thomas
Gazagnaire, and Anil Madhavapeddy for the reports. And to Tarides for
make it possible that I spend some time on reviewing, merging, and
releasing mirage-crypto.
mirage-crypto-ec
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• timing attack on NIST lookup tables
<https://osv.dev/vulnerability/OSEC-2026-17>
<https://github.com/mirage/mirage-crypto/commit/1a61aeee7f593ec067612df1739ec905eab0450f>
• now uses blinding <https://github.com/mirage/mirage-crypto/pull/285>
• do not accept point at infinity as ECDSA key
<https://osv.dev/vulnerability/OSEC-2026-13>
<https://github.com/mirage/mirage-crypto/commit/ca84f5ee8ede80bd1dd2aa4cd7cc90197752184e>
• return early from scalar_mult in ED25519
<https://github.com/mirage/mirage-crypto/commit/3b4ba91799700561509d0c6a2de81ed249d7b2b1>
• X25519 compare in constant time
<https://github.com/mirage/mirage-crypto/commit/1aa4cf5e4c92dcb3edfa83b971e569fa05b8f47d>
• properly encode the compressed point 0
<https://github.com/mirage/mirage-crypto/commit/94cba54d8dbb5701c3bd7e1317b3f3987c1871e2>
mirage-crypto
╌╌╌╌╌╌╌╌╌╌╌╌╌
• decrypt only after AEAD tag has been verified
<https://osv.dev/vulnerability/OSEC-2026-12>
<https://github.com/mirage/mirage-crypto/commit/25e7570aec91e092b347561c23f84b6ec39e7163>
• more bounds checks
<https://github.com/mirage/mirage-crypto/pull/281>
<https://github.com/mirage/mirage-crypto/pull/290>
<https://github.com/mirage/mirage-crypto/commit/1f0bf67044e67cf6e46911fcd77a0ff706b6c3e7>
<https://osv.dev/vulnerability/OSEC-2026-15>
<https://github.com/mirage/mirage-crypto/commit/7b5650b72314d65602d0baccbf83ad3013cb37d4>
• avoid unaligned access
<https://github.com/mirage/mirage-crypto/pull/292>
• reject bad ChaCha20 keys
<https://github.com/mirage/mirage-crypto/commit/7f505b0dc232805c0c725e99b5fbfa49b1be7c7e>
• avoid padding when adata is aligned
<https://github.com/mirage/mirage-crypto/commit/999cac90f0de1e4b36451807c0e0dbee6edfde06>
• avoid too long CCM messages
<https://github.com/mirage/mirage-crypto/pull/304>
• AEAD ciphers avoid counter wrapping
<https://github.com/mirage/mirage-crypto/pull/305>
<https://github.com/mirage/mirage-crypto/pull/306>
<https://github.com/mirage/mirage-crypto/pull/304>
mirage-crypto-rng
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• the entropy harvesting test is now executed at initialization time
of mirage-crypto-mkernel and mirage-crypto-rng-mirage
<https://github.com/mirage/mirage-crypto/pull/282>
• fix entropy source IDs
<https://github.com/mirage/mirage-crypto/commit/86161d1f51fd748038d917a69490eba714bb60d5>
• urandom RNG make it so that a fork doesn't repeat numbers
<https://github.com/mirage/mirage-crypto/pull/302>
• detect RDSEED properly
<https://github.com/mirage/mirage-crypto/commit/0f858a9e165c004e716761385284aadc119b7006>
mirage-crypto-pk
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
• DSA avoid division by 0
<https://github.com/mirage/mirage-crypto/pull/289>
• RSA avoid Invalid_argument when message is 2
<https://osv.dev/vulnerability/OSEC-2026-14>
<https://github.com/mirage/mirage-crypto/commit/a0f59a0c90eb067505b55a03d3bb104eacd6dd33>
• fix hardcoded DH groups
<https://github.com/mirage/mirage-crypto/pull/297>
• fix decoding of OAEP without a separator
<https://github.com/mirage/mirage-crypto/commit/eca6fb33e44bfa374d4c625fa6295670efe7040b>
Rpmfile 1.0.0 and Bytream 0.2
═════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-rpmfile-1-0-0-bytream-0-2/18477/1>
Mikhail announced
─────────────────
Yo!
I am happy to announce the first major release of the [Rpmfile]
library (for parsing RPM files) and a minor update of the [Bytream]
library (streaming bytes and crunching them last library).
┌────
│ let () =
│ let metadata =
│ In_channel.with_open_bin
│ "hello.rpm"
│ Rpmfile.Reader.from_channel_without_payload
│ in
│
│ let name, release = Rpmfile.View.(name metadata, release metadata) in
│ Printf.printf "%s.%s\n" name release
│ (* hello.1.3 *)
└────
[Rpmfile] <https://github.com/dx3mod/rpmfile>
[Bytream] <https://github.com/dx3mod/bytream>
Changes
╌╌╌╌╌╌╌
• Rpmfile reader has been moved from Angstrom library to Bytream
library. The biggest change in this version is the start of using
the Bytream library to read RPM files from input/output streams
• Added CPIO archive reader (does not automatically decompress RPM
file's payload, you will need to do that yourself)
Not done yet
╌╌╌╌╌╌╌╌╌╌╌╌
• Signatures verification
• Payload decompression
• Digests
oxbow, a dynamic tiling window manager for the Wayland compositor River
═══════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-oxbow-a-dynamic-tiling-window-manager-for-the-wayland-compositor-river/18484/1>
Cole announced
──────────────
Hello!
I'm excited to share a project I've been working on for the past few
months, [oxbow].
It's heavily inspired by my time using dwm, with some ideas taken from
other window managers like Hyprland and Niri. Features include:
• Per-tag configuration (layout, mfact, gaps, etc.)
• Tiling layouts including even, diminish, dwindle, spiral, deck, and
monocle
• Niri-ish scrolling in four orientations
• "alt-tab"-like overview
• Pure floating layout; oxbow respects native drag and resize requests
on windows, making floating mode feel more natural
• Popular dwm patches such as scratchpads, sticky windows, window
swallowing, and gaps
• Regex-based window rules to configure initial tags, output, size,
position, and more
• IPC control via `oxctl' to configure all of the above, query state,
and subscribe to events
oxbow is packaged in opam, but you can also install it with Nix/NixOS.
You may notice this is my first post; that is because this project is
my first venture into OCaml! I wrote oxbow to be the window manager
I've always wanted, but also to learn OCaml. I've really enjoyed the
experience, and I plan to use OCaml in a few other projects. I've done
my best to take advantage of OCaml's strengths, but I'm fully open to
any suggestions/PRs/etc. to improve the internals or any other aspect
of oxbow.
Thank you for having me!
[oxbow] <https://oxbow-wm.readthedocs.io>
cdp 0.1.0 - typed Chrome DevTools Protocol libraries for OCaml
══════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-cdp-0-1-0-typed-chrome-devtools-protocol-libraries-for-ocaml/18486/1>
Atlas07 announced
─────────────────
Hi everyone,
I'm happy to announce the first release of [ocaml-cdp] - typed OCaml
libraries for the [Chrome DevTools Protocol].
[ocaml-cdp] <https://github.com/ahrefs/ocaml-cdp>
[Chrome DevTools Protocol]
<https://chromedevtools.github.io/devtools-protocol/>
Why
╌╌╌
CDP lets a program control a real Chrome: open pages, run JavaScript,
take screenshots, render PDFs, watch network traffic. OCaml had no
CDP library. `ocaml-cdp' fills that gap: it turns the official
protocol definitions into typed OCaml modules, so the compiler checks
every command, event, and field.
What you get
╌╌╌╌╌╌╌╌╌╌╌╌
Three packages:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Package Where What it is
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
`cdp' opam Typed protocol domains: records, enums, commands, events, with JSON codecs. Transport-agnostic.
`cdp-gen' opam The generator CLI: protocol JSON in, OCaml out. Any revision, your own domain selection.
`cdp-lwt' GitHub only for now (see below) The client: launches or attaches to a Chrome and drives it over `libcurl' WebSockets.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
`cdp' ships 10 domains (Browser, DOM, Debugger, Emulation, IO,
Network, Page, Runtime, Security, Target); the generator covers all
58.
Here is the full round trip: launch a headless Chrome, open a page,
read its title back:
┌────
│ let%lwt chrome = Cdp_lwt.Chrome.launch () in
│ let%lwt transport = Cdp_lwt.Curl_transport.connect ~url:chrome.ws_url () in
│ let connection = Cdp_lwt.Connection.create transport in
│ let call ?session command = Cdp_lwt.Connection.call connection ?session command in
│ let%lwt created =
│ call (Cdp.Target.Create_target.command (Cdp.Target.Create_target.make_params ~url:"about:blank" ()))
│ in
│ let%lwt attached =
│ call (Cdp.Target.Attach_to_target.command
│ (Cdp.Target.Attach_to_target.make_params ~target_id:created.target_id ~flatten:true ()))
│ in
│ let session = attached.session_id in
│ let%lwt () = call ~session (Cdp.Page.Enable.command (Cdp.Page.Enable.make_params ())) in
│ let loaded = Cdp_lwt.Connection.next_event connection ~session Cdp.Page.Load_event_fired.event in
│ let%lwt _nav =
│ call ~session (Cdp.Page.Navigate.command
│ (Cdp.Page.Navigate.make_params ~url:"https://ocaml.org" ()))
│ in
│ let%lwt _fired = loaded in
│ let%lwt evaluated =
│ call ~session (Cdp.Runtime.Evaluate.command (Cdp.Runtime.Evaluate.make_params ~expression:"document.title" ()))
│ in
└────
Why cdp-lwt is not on opam yet
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
`cdp-lwt' uses libcurl's WebSocket API through the `curl'
bindings. That API is on ocurl's master branch, but not in any ocurl
release yet. `cdp-lwt' builds fine from a clone (its opam file pins
ocurl master). As soon as ocurl makes a release, `cdp-lwt' follows
onto opam.
Hardcaml Networking Library - Toy Project
═════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/hardcaml-networking-library-toy-project/18488/1>
Bohdan Purtell announced
────────────────────────
General Kenobi
╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Greetings.
My name is Bo Purtell, and I'm an aspiring senior at the University of
Florida.
Wanted to share a little project I've been working on over the course
of the last year being a small networking stack for the `hardcaml'
ecosystem for hardware development with OCaml! The project is still in
it's infancy stages right now, but I've validated out a 10/100Mb
duplex interface with very loose IPv4 and UDP support, and I'm
currently wrapping up a PCS layer for 64/66b BASE-R encodings for 10G
applications. A tad limited with my servers getting moved all the way
back to Florida (from Cali) though, and I lost one of my regression
machines in the move so going to have to go dive into docker stuff
again - bleh.
<https://github.com/LeEmperor/hardcaml_networking>
It's All Math
╌╌╌╌╌╌╌╌╌╌╌╌╌
I fear that I cannot go back to writing SystemVerilog the same way
anymore given the wonderful levels of abstraction that I was able to
get away with in OCaml. I firmly believe that my thinking of how
"state" is represented, and the fact that I could reach for
mathematical terminology when I went to describe an OCaml construct
helped me immensely in being able to reason about some of these
systems as I was constructing them. Helps with verification to an
extent too.
Challenges
╌╌╌╌╌╌╌╌╌╌
The biggest challenge I faced was the structuring of my verification
suites and testing. There are a few floating hardcaml projects around,
but trying to integrate around the expect test framework was a tad
difficult since said examples are quite poor in demonstrating
re-usable architecture or integration testing. I had thoughts that
`Alcotest' might be used for larger integration suites, but I feel
it's philosophy goes against what a standard expect test is even
shooting at doing. Ultimately, expect tests pushed me to Emacs (from
Neovim), as expect tests and `tuareg' fit nicely together - if I had
to go pasting s-expressions again from the terminal I probably
would've imploded. The change is definitely interesting, but well
worth it in terms of configurability and OCaml support.
`Quickcheck' tests were quite nifty as well, but I was flying
completely blind on using those, as there are seldom examples for any
properly-sized projects release. It was nice to see that alot of my
own UVM-based idioms that I am familiar with translated somewhat well
with the `Observation.t' and `Snapshot.t' formations, but it would
still be nice to see what actual production-grade hardcaml
verification looks like. Wish there were formal verif examples as well
as I have been firmly grasped by the formal-verif-bug, but only a few
dronings in dead branches were all I could muster.
In Space!
╌╌╌╌╌╌╌╌╌
Truly a bummer that no functional languages will ever see industry
use. With that in mind, after wrapping up a double-internship stint
Spring & Summer I can finally claim that some nonzero amount of
Hardcaml is flying in Space! If anyone has any questions feel free to
shoot me a message here or on LinkedIn!
PS : if anyone is familiar with proper hardcaml-based verification,
could I beg for a quick chat on how integration tests would even work
with expect systems? Do I just chuck a gigantic 300-line s-expression
into the expected field? Surely not. Does `Alcotest' even enter the
vocabulary for such things then?
FUN OCaml 2027 in Bangalore, Jan 25-26 - Time to Send Talk and Workshop Proposals - Until Sep 30
════════════════════════════════════════════════════════════════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/fun-ocaml-2027-in-bangalore-jan-25-26-time-to-send-talk-and-workshop-proposals-until-sep-30/18490/1>
Sabine Schmaltz announced
─────────────────────────
Hi everyone!
We are super excited to announce that [FP Launchpad] is hosting **FUN
OCaml 2027 in Bangalore**! This will be the very first edition of FUN
OCaml (and the first major OCaml conference) in India.
FUN OCaml 2027 is a two-day open source hacking event dedicated to
OCaml enthusiasts and professionals, focusing on the real-world impact
of OCaml and bringing our global community together.
*Event Details*
• *Dates:* January 25-26, 2027
• *Location:* MLR Convention Centre, Brigade Millennium Campus, JP
Nagar 7th Phase, Bangalore
• *Format:* Day 1 is dedicated to talks (including a keynote,
live-streamed online), and Day 2 features hands-on workshops and
collaborative hacking.
*Call for Participation (CFP) is Open!*
The call is open through *September 30*. We welcome submissions from
all experience levels - whether you are a first-time speaker, industry
practitioner, academic researcher, or open source maintainer.
Topics we are especially excited about:
• How you use OCaml in your business or personal projects
• OCaml libraries, frameworks, and tools in the ecosystem
• Hands-on demonstrations that inspire people to hack on Day 2
• Deep dives into actual code and the reasoning behind design
decisions
• Experience reports and lessons learned
All talks will be live-streamed and uploaded to watch.ocaml.org and
[FUN OCaml's YouTube channel].
• *Submit your proposal:* <https://fun-ocaml.com/> (or directly via
the [CFP submission link])
• *Stay updated:* Follow FUN OCaml on its various social channels and
join the FUN OCaml Discord server (see website).
We can't wait to see your proposals and look forward to welcoming you
to Bangalore!
*Note:* A major reason why we've chosen to host FUN OCaml in India
this year is that we will (a) have an easy time getting the event
fully booked, with both students and professionals, and (b) will be
able to again afford high production quality recordings. We expect
higher demand and more participants for the OCaml beginners
workshop. At the same time, we understand that traveling to India is
less ideal than traveling in the EU.
As a speaker, if there's any concern about funding travel, please
check the box in the CFP form to apply for financial assistance. Also,
send your proposals early, so that you can start visa application (we
provide visa support) as soon as your session is accepted.
[FP Launchpad] <https://fplaunchpad.org/>
[FUN OCaml's YouTube channel] <https://www.youtube.com/@FUNOCaml>
[CFP submission link]
<https://cfp.fun-ocaml.com/fun-ocaml-2027-bengaluru/cfp>
ease-caml - Easing library for OCaml
════════════════════════════════════
Archive:
<https://discuss.ocaml.org/t/ann-ease-caml-easing-library-for-ocaml/18494/1>
Christopher Sumnicht announced
──────────────────────────────
Hi everyone,
I am happy to introduce: [ease-caml] (on [opam]) - an easing library
for OCaml.
[ease-caml] <https://github.com/Modular-Game-Components/ease-caml>
[opam] <https://opam.ocaml.org/packages/ease-caml/>
Why?
╌╌╌╌
In video games you often want to manage animations and
transitions. Usually this requires deforming a floating point value
from one value to another (often continuously) over time so that an
object moves from one place to another. Such a deformation is often
referred to as an easing or tween. It can be hard to keep track of
tweens. In Lua, there are various libraries like hump.timer and Flux
which help manage and organize the tweens you have made so you can
easily create different kinds and have a single source of updating
them. ease-caml is inspired by those libraries and is intended to help
with OCaml game development.
Also, I mentioned games above: Whether you use SDL, Raylib, or pretty
much anything else, you can use this library. It just requires an
update loop.
Example
╌╌╌╌╌╌╌
Here is a small example of a bouncing ball (uses raylib-ocaml).
┌────
│ type circle =
│ {
│ r: float;
│ x: float;
│ y: float ref;
│ }
│
│ let ball : circle = { r = 40.0; x = 400.0; y = ref ~-.40.0 }
│ let ty = Tween.make_tween ball.y 225.0 ~ef:Easers.bounce 1.0
│ let tm = Tween.new_manager ()
│
│ let setup () =
│ Raylib.init_window 800 450 "simple_tween";
│ Raylib.set_target_fps 60;
│ Tween.add ty tm
│
│ let rec loop () =
│ if Raylib.window_should_close () then Raylib.close_window ()
│ else (
│ let open Raylib in
│ Tween.update tm (get_frame_time ());
│ begin_drawing ();
│ clear_background Color.raywhite;
│ draw_circle_v (Vector2.create ball.x !(ball.y)) ball.r Color.maroon;
│ end_drawing ();
│ loop ()
│ )
│
│ let () = setup () |> loop
└────
(Note as a new user I cannot put more than 2 links. If you need help
finding hump.timer, Flux, or raylib-ocaml, please let me know!)
opam 2.6.0~alpha1
═════════════════
Archive: <https://discuss.ocaml.org/t/ann-opam-2-6-0-alpha1/18372/4>
Continuing this thread, Kate announced
──────────────────────────────────────
Hot on the heels of beta1, we are happy to announce the release of
opam 2.6.0~beta2.
This version is a beta, we invite users to test it to spot previously
unnoticed bugs as we head towards the stable release.
Main changes compared to 2.6.0~beta1
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
:hourglass_done: The main change is a fix of a performance regression
compared to opam 2.5, where opam project trees were scanned for
nothing, when pinning them, making commands such as `opam install
–deps-only .` excruatingly slow on large projects ([#7098])
:open_book: You can read our [blog post] for more information about
these changes and more, and for even more details you can take a look
at the [release note] or the [changelog].
[#7098] <https://github.com/ocaml/opam/issues/7098>
[blog post] <https://opam.ocaml.org/blog/opam-2-6-0-beta2/>
[release note] <https://github.com/ocaml/opam/releases/tag/2.6.0-beta2>
[changelog] <https://github.com/ocaml/opam/blob/2.6.0-beta2/CHANGES>
Try it!
╌╌╌╌╌╌╌
The upgrade instructions are unchanged:
For Unix systems
┌────
│ bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.6.0~beta2"
└────
or from PowerShell for Windows systems
┌────
│ Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.6.0~beta2"
└────
Please report any issues to the [bug-tracker].
Happy hacking, <> <> The opam team <> <> :camel:
[bug-tracker] <https://github.com/ocaml/opam/issues>
Old CWN
═══════
If you happen to miss a CWN, you can [send me a message] and I'll mail
it to you, or go take a look at [the archive] or the [RSS feed of the
archives].
If you also wish to receive it every week by mail, you may subscribe
to the [caml-list].
[Alan Schmitt]
[send me a message] <mailto:alan.schmitt@polytechnique.org>
[the archive] <https://alan.petitepomme.net/cwn/>
[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>
[caml-list] <https://sympa.inria.fr/sympa/info/caml-list>
[Alan Schmitt] <https://alan.petitepomme.net/>
[-- Attachment #1.1.2: Type: text/html, Size: 56876 bytes --]
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 568 bytes --]
next reply other threads:[~2026-09-01 9:14 UTC|newest]
Thread overview: 309+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 9:14 Alan Schmitt [this message]
-- strict thread matches above, loose matches on Subject: below --
2026-09-08 13:20 Alan Schmitt
2026-08-25 7:36 Alan Schmitt
2026-08-18 6:56 Alan Schmitt
2026-08-11 12:25 Alan Schmitt
2026-08-04 7:44 Alan Schmitt
2026-07-28 12:44 Alan Schmitt
2026-07-21 16:02 Alan Schmitt
2026-07-14 7:16 Alan Schmitt
2026-07-07 13:29 Alan Schmitt
2026-06-30 13:25 Alan Schmitt
2026-06-23 10:07 Alan Schmitt
2026-06-16 10:51 Alan Schmitt
2026-06-09 7:39 Alan Schmitt
2026-06-02 9:01 Alan Schmitt
2026-05-26 7:36 Alan Schmitt
2026-05-19 8:52 Alan Schmitt
2026-05-12 7:28 Alan Schmitt
2026-05-05 9:35 Alan Schmitt
2026-04-28 7:59 Alan Schmitt
2026-04-21 9:34 Alan Schmitt
2026-04-14 9:50 Alan Schmitt
2026-04-07 9:32 Alan Schmitt
2026-03-31 6:10 Alan Schmitt
2026-03-24 9:58 Alan Schmitt
2026-03-17 14:39 Alan Schmitt
2026-03-10 13:30 Alan Schmitt
2026-03-03 13:54 Alan Schmitt
2026-02-24 13:36 Alan Schmitt
2026-02-17 13:47 Alan Schmitt
2026-02-10 10:36 Alan Schmitt
2026-02-03 10:04 Alan Schmitt
2026-01-27 12:41 Alan Schmitt
2026-01-20 9:19 Alan Schmitt
2026-01-13 8:27 Alan Schmitt
2026-01-06 13:14 Alan Schmitt
2025-12-30 9:33 Alan Schmitt
2025-12-23 11:00 Alan Schmitt
2025-12-16 13:30 Alan Schmitt
2025-12-09 15:04 Alan Schmitt
2025-12-02 10:39 Alan Schmitt
2025-11-25 13:49 Alan Schmitt
2025-11-18 14:01 Alan Schmitt
2025-11-11 9:49 Alan Schmitt
2025-11-04 13:21 Alan Schmitt
2025-10-28 13:30 Alan Schmitt
2025-10-21 9:17 Alan Schmitt
2025-10-14 9:56 Alan Schmitt
2025-10-07 12:22 Alan Schmitt
2025-09-30 13:12 Alan Schmitt
2025-09-23 13:23 Alan Schmitt
2025-09-16 11:52 Alan Schmitt
2025-09-09 12:30 Alan Schmitt
2025-09-02 12:23 Alan Schmitt
2025-08-26 12:34 Alan Schmitt
2025-08-19 12:20 Alan Schmitt
2025-08-12 15:32 Alan Schmitt
2025-08-05 8:17 Alan Schmitt
2025-07-29 9:36 Alan Schmitt
2025-07-22 12:07 Alan Schmitt
2025-07-15 17:14 Alan Schmitt
2025-07-08 12:45 Alan Schmitt
2025-07-01 11:16 Alan Schmitt
2025-06-24 14:02 Alan Schmitt
2025-06-17 6:44 Alan Schmitt
2025-06-10 13:36 Alan Schmitt
2025-06-03 9:19 Alan Schmitt
2025-05-27 9:22 Alan Schmitt
2025-05-20 11:52 Alan Schmitt
2025-05-13 9:40 Alan Schmitt
2025-05-06 7:24 Alan Schmitt
2025-04-29 8:39 Alan Schmitt
2025-04-22 11:50 Alan Schmitt
2025-04-15 9:51 Alan Schmitt
2025-04-08 13:14 Alan Schmitt
2025-04-01 9:12 Alan Schmitt
2025-03-25 8:06 Alan Schmitt
2025-03-18 10:18 Alan Schmitt
2025-03-11 15:00 Alan Schmitt
2025-03-04 14:01 Alan Schmitt
2025-02-25 10:36 Alan Schmitt
2025-02-18 14:33 Alan Schmitt
2025-02-11 7:17 Alan Schmitt
2025-02-04 12:05 Alan Schmitt
2025-01-28 13:24 Alan Schmitt
2025-01-21 15:47 Alan Schmitt
2025-01-14 8:20 Alan Schmitt
2025-01-07 17:26 Alan Schmitt
2024-12-31 8:03 Alan Schmitt
2024-12-24 8:55 Alan Schmitt
2024-12-17 13:05 Alan Schmitt
2024-12-10 13:48 Alan Schmitt
2024-12-03 14:44 Alan Schmitt
2024-11-26 8:30 Alan Schmitt
2024-11-19 6:52 Alan Schmitt
2024-11-12 15:00 Alan Schmitt
2024-11-05 13:22 Alan Schmitt
2024-10-29 13:30 Alan Schmitt
2024-10-22 12:42 Alan Schmitt
2024-10-15 13:31 Alan Schmitt
2024-10-08 10:56 Alan Schmitt
2024-10-01 13:37 Alan Schmitt
2024-09-24 13:18 Alan Schmitt
2024-09-17 14:02 Alan Schmitt
2024-09-10 13:55 Alan Schmitt
2024-09-03 8:24 Alan Schmitt
2024-08-27 9:02 Alan Schmitt
2024-08-20 9:29 Alan Schmitt
2024-08-13 13:21 Alan Schmitt
2024-08-06 9:00 Alan Schmitt
2024-07-30 13:26 Alan Schmitt
2024-07-23 13:30 Alan Schmitt
2024-07-16 6:24 Alan Schmitt
2024-07-09 9:19 Alan Schmitt
2024-07-02 7:30 Alan Schmitt
2024-06-25 13:58 Alan Schmitt
2024-06-18 13:05 Alan Schmitt
2024-06-11 15:04 Alan Schmitt
2024-06-04 13:26 Alan Schmitt
2024-05-28 9:07 Alan Schmitt
2024-05-21 13:07 Alan Schmitt
2024-05-14 13:25 Alan Schmitt
2024-05-07 7:30 Alan Schmitt
2024-04-30 7:22 Alan Schmitt
2024-04-23 12:17 Alan Schmitt
2024-04-16 12:00 Alan Schmitt
2024-04-09 9:15 Alan Schmitt
2024-04-02 14:31 Alan Schmitt
2024-03-26 6:32 Alan Schmitt
2024-03-19 15:09 Alan Schmitt
2024-03-12 10:31 Alan Schmitt
2024-03-05 14:50 Alan Schmitt
2024-02-27 13:53 Alan Schmitt
2024-02-20 9:12 Alan Schmitt
2024-02-13 8:42 Alan Schmitt
2024-02-06 15:14 Alan Schmitt
2024-01-30 14:16 Alan Schmitt
2024-01-23 9:45 Alan Schmitt
2024-01-16 10:01 Alan Schmitt
2024-01-09 13:40 Alan Schmitt
2024-01-02 8:59 Alan Schmitt
2023-12-26 10:12 Alan Schmitt
2023-12-19 10:10 Alan Schmitt
2023-12-12 10:20 Alan Schmitt
2023-12-05 10:13 Alan Schmitt
2023-11-28 9:09 Alan Schmitt
2023-11-21 7:47 Alan Schmitt
2023-11-14 13:42 Alan Schmitt
2023-11-07 10:31 Alan Schmitt
2023-10-31 10:43 Alan Schmitt
2023-10-24 9:17 Alan Schmitt
2023-10-17 7:46 Alan Schmitt
2023-10-10 7:48 Alan Schmitt
2023-10-03 13:00 Alan Schmitt
2023-09-19 8:54 Alan Schmitt
2023-09-12 13:21 Alan Schmitt
2023-09-05 9:00 Alan Schmitt
2023-08-29 13:04 Alan Schmitt
2023-08-22 9:20 Alan Schmitt
2023-08-15 16:33 Alan Schmitt
2023-08-08 8:53 Alan Schmitt
2023-08-01 7:13 Alan Schmitt
2023-07-25 8:45 Alan Schmitt
2023-07-11 8:45 Alan Schmitt
2023-07-04 9:18 Alan Schmitt
2023-06-27 8:38 Alan Schmitt
2023-06-20 9:52 Alan Schmitt
2023-06-13 7:09 Alan Schmitt
2023-06-06 14:22 Alan Schmitt
2023-05-30 15:43 Alan Schmitt
2023-05-23 9:41 Alan Schmitt
2023-05-16 13:05 Alan Schmitt
2023-05-09 11:49 Alan Schmitt
2023-05-02 8:01 Alan Schmitt
2023-04-25 9:25 Alan Schmitt
2023-04-18 8:50 Alan Schmitt
2023-04-11 12:41 Alan Schmitt
2023-04-04 8:45 Alan Schmitt
2023-03-28 7:21 Alan Schmitt
2023-03-21 10:07 Alan Schmitt
2023-03-14 9:52 Alan Schmitt
2023-03-07 9:02 Alan Schmitt
2023-02-28 14:38 Alan Schmitt
2023-02-21 10:19 Alan Schmitt
2023-02-14 8:12 Alan Schmitt
2023-02-07 8:16 Alan Schmitt
2023-01-31 6:44 Alan Schmitt
2023-01-24 8:57 Alan Schmitt
2023-01-17 8:37 Alan Schmitt
2022-11-29 14:53 Alan Schmitt
2022-09-27 7:17 Alan Schmitt
2022-09-20 14:01 Alan Schmitt
2022-09-13 8:40 Alan Schmitt
2022-08-23 8:06 Alan Schmitt
2022-08-16 8:51 Alan Schmitt
2022-08-09 8:02 Alan Schmitt
2022-08-02 9:51 Alan Schmitt
2022-07-26 17:54 Alan Schmitt
2022-07-19 8:58 Alan Schmitt
2022-07-12 7:59 Alan Schmitt
2022-07-05 7:42 Alan Schmitt
2022-06-28 7:37 Alan Schmitt
2022-06-21 8:06 Alan Schmitt
2022-06-14 9:29 Alan Schmitt
2022-06-07 10:15 Alan Schmitt
2022-05-31 12:29 Alan Schmitt
2022-05-24 8:04 Alan Schmitt
2022-05-17 7:12 Alan Schmitt
2022-05-10 12:30 Alan Schmitt
2022-05-03 9:11 Alan Schmitt
2022-04-26 6:44 Alan Schmitt
2022-04-19 5:34 Alan Schmitt
2022-04-12 8:10 Alan Schmitt
2022-04-05 11:50 Alan Schmitt
2022-03-29 7:42 Alan Schmitt
2022-03-22 13:01 Alan Schmitt
2022-03-15 9:59 Alan Schmitt
2022-03-01 13:54 Alan Schmitt
2022-02-22 12:43 Alan Schmitt
2022-02-08 13:16 Alan Schmitt
2022-02-01 13:00 Alan Schmitt
2022-01-25 12:44 Alan Schmitt
2022-01-11 8:20 Alan Schmitt
2022-01-04 7:56 Alan Schmitt
2021-12-28 8:59 Alan Schmitt
2021-12-21 9:11 Alan Schmitt
2021-12-14 11:02 Alan Schmitt
2021-11-30 10:51 Alan Schmitt
2021-11-16 8:41 Alan Schmitt
2021-11-09 10:08 Alan Schmitt
2021-11-02 8:50 Alan Schmitt
2021-10-19 8:23 Alan Schmitt
2021-09-28 6:37 Alan Schmitt
2021-09-21 9:09 Alan Schmitt
2021-09-07 13:23 Alan Schmitt
2021-08-24 13:44 Alan Schmitt
2021-08-17 6:24 Alan Schmitt
2021-08-10 16:47 Alan Schmitt
2021-07-27 8:54 Alan Schmitt
2021-07-20 12:58 Alan Schmitt
2021-07-06 12:33 Alan Schmitt
2021-06-29 12:24 Alan Schmitt
2021-06-22 9:04 Alan Schmitt
2021-06-01 9:23 Alan Schmitt
2021-05-25 7:30 Alan Schmitt
2021-05-11 14:47 Alan Schmitt
2021-05-04 8:57 Alan Schmitt
2021-04-27 14:26 Alan Schmitt
2021-04-20 9:07 Alan Schmitt
2021-04-06 9:42 Alan Schmitt
2021-03-30 14:55 Alan Schmitt
2021-03-23 9:05 Alan Schmitt
2021-03-16 10:31 Alan Schmitt
2021-03-09 10:58 Alan Schmitt
2021-02-23 9:51 Alan Schmitt
2021-02-16 13:53 Alan Schmitt
2021-02-02 13:56 Alan Schmitt
2021-01-26 13:25 Alan Schmitt
2021-01-19 14:28 Alan Schmitt
2021-01-12 9:47 Alan Schmitt
2021-01-05 11:22 Alan Schmitt
2020-12-29 9:59 Alan Schmitt
2020-12-22 8:48 Alan Schmitt
2020-12-15 9:51 Alan Schmitt
2020-12-01 8:54 Alan Schmitt
2020-11-03 15:15 Alan Schmitt
2020-10-27 8:43 Alan Schmitt
2020-10-20 8:15 Alan Schmitt
2020-10-06 7:22 Alan Schmitt
2020-09-29 7:02 Alan Schmitt
2020-09-22 7:27 Alan Schmitt
2020-09-08 13:11 Alan Schmitt
2020-09-01 7:55 Alan Schmitt
2020-08-18 7:25 Alan Schmitt
2020-07-28 16:57 Alan Schmitt
2020-07-21 14:42 Alan Schmitt
2020-07-14 9:54 Alan Schmitt
2020-07-07 10:04 Alan Schmitt
2020-06-30 7:00 Alan Schmitt
2020-06-16 8:36 Alan Schmitt
2020-06-09 8:28 Alan Schmitt
2020-05-19 9:52 Alan Schmitt
2020-05-12 7:45 Alan Schmitt
2020-05-05 7:45 Alan Schmitt
2020-04-28 12:44 Alan Schmitt
2020-04-21 8:58 Alan Schmitt
2020-04-14 7:28 Alan Schmitt
2020-04-07 7:51 Alan Schmitt
2020-03-31 9:54 Alan Schmitt
2020-03-24 9:31 Alan Schmitt
2020-03-17 11:04 Alan Schmitt
2020-03-10 14:28 Alan Schmitt
2020-03-03 8:00 Alan Schmitt
2020-02-25 8:51 Alan Schmitt
2020-02-18 8:18 Alan Schmitt
2020-02-04 8:47 Alan Schmitt
2020-01-28 10:53 Alan Schmitt
2020-01-21 14:08 Alan Schmitt
2020-01-14 14:16 Alan Schmitt
2020-01-07 13:43 Alan Schmitt
2019-12-31 9:18 Alan Schmitt
2019-12-17 8:52 Alan Schmitt
2019-12-10 8:21 Alan Schmitt
2019-12-03 15:42 Alan Schmitt
2019-11-26 8:33 Alan Schmitt
2019-11-12 13:21 Alan Schmitt
2019-11-05 6:55 Alan Schmitt
2019-10-15 7:28 Alan Schmitt
2019-09-03 7:35 Alan Schmitt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2y0dl1ggb.fsf@petitepomme.net \
--to=alan.schmitt@polytechnique.org \
--cc=caml-list@inria.fr \
--cc=lwn@lwn.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox