Sign in

OCaml

@ocaml.org
1.3K followers 15 following 642 posts

ocaml.org

PostsRepliesMedia
OCaml @ocaml.org · 21/09/2026
dlvr.it
opam 2.6.0 release
Feedback on this post is welcome on Discuss! We're happy to announce the release of opam 2.6.0 and encourage all users to upgrade. Please read on for installation and upgrade instructions. Try it! The upgrade instructions are unchanged: * Either from binaries: run For Unix systems bash -c "sh
010
OCaml @ocaml.org · 17/09/2026
dlvr.it
Release of OCaml 5.5.1
We have the pleasure of celebrating the birthday of Giovanni Girolamo Saccheri by announcing the release of OCaml version 5.5.1. This patch-level release fixes a major type system bug for module-dependent functions and also contains two security fixes for the runtime: one in the Marshal module, another inside the loading of bytecode. At a less severe level, this release also fixes two bugs in the runtime for concurrent programs, another runtime bug for musl users; and a handful of other bugs. The release also restores support for cloning the compiler on macOS. Overall, we are strongly advising you to switch to OCaml 5.5.1 if you were already using OCaml 5.5.0. The full list of changes can be found in the full changelog. --- Installation Instructions The base compiler can be installed as an opam switch with the following commands: opam update opam switch create 5.5.1 The source code for the release is also directly available on: * GitHub * OCaml archives at Inria Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: opam update opam switch create ocaml-variants.5.5.1+options where is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch: opam switch create 5.5.1+flambda+nffa ocaml-variants.5.5.1+options ocaml-option-flambda ocaml-option-no-flat-float-array
042
OCaml @ocaml.org · 01/09/2026
dlvr.it
opam 2.5.2
Feedback on this post is welcomed on Discuss! We are pleased to announce the release of opam 2.5.2 fixing a security issue (OSEC-2026-10) and other minor things. We advise everyone to upgrade. Please read on for installation and upgrade instructions. Security fix * OSEC-2026-10 / CVE-2026-57825: Fix a bug that allowed a package to install files anywhere on the system using a symlink to an external directory without warning the user and asking for their permission (#7005) Distributions maintainers that have not already done so, are invited to either upgrade their opam package to 2.5.2 or backport the fix. For any questions please send an email to the authors of this here blog post as listed above. Other changes * Re-allow .. in .install files, partially reverting 2.5.1's #6898 (#7009, ocaml/dune#14393) Try it! The upgrade instructions are unchanged: * Either from binaries: run For Unix systems bash -c "sh
000
OCaml @ocaml.org · 31/08/2026
Day 1: talks (live-streamed) Day 2: hands-on workshops & hacking Financial assistance and visa support available for speakers.
000
OCaml @ocaml.org · 31/08/2026
FUN OCaml 2027 is coming to Bangalore on January 25-26! We're looking for talks and workshops about OCaml - production use, code design, libraries, tools, or experience reports. CFP open until September 30. All levels welcome. Submit: fun-ocaml.com
fun-ocaml.com
FUN OCaml 2027: OCaml Conference & Workshops | Bengaluru Jan 25-26 - Fun OCaml 2027
Join FUN OCaml 2027: a 2-day open source OCaml conference in Bengaluru, India with talks, hands-on workshops, and collaborative hacking. Organized by FP Launchpad, IIT Madras.
120
OCaml @ocaml.org · 26/08/2026
dlvr.it
Dune 3.24.1
The Dune team is pleased to announce the release of dune 3.24.1. This patch release includes bug fixes and a change to Melange sandboxing defaults. See the full changelog for all the changes and for attribution to the contributors who made it all possible. Thank you, contributors! If you encounter a problem with this release, please report it in our issue tracker.
000
OCaml @ocaml.org · 23/07/2026
dlvr.it
Dune 3.24.0
The Dune team is pleased to announce the release of dune 3.24.0. Highlights include the following * Dune package management now uses the relocatable compiler by default, for all supported compiler versions. This brings a massive speedup to workspace setup in the many cases where built compiler versions can be reused. (ocaml/dune#14357, @Alizter) * Directory targets are now generally available (ocaml/dune#14579), allowing tools to produce entire directory trees as targets. See the documentation on directory targets for details. * Path handling has been refined, improving the consistency of paths across platforms (ocaml/dune#14278 and ocaml/dune#14278) and using a more consistent and disciplined location for %{bin:NAME} variable expansions (ocaml/dune#14432). * Path-valued percent forms (%{bin:...}, %{dep:...}, %{path:...}, and friends) now expand same-directory paths with a leading ./, so that shells like bash in (bash ...) and (system ...) actions execute them directly instead of looking them up in PATH (ocaml/dune#15156). This is a breaking change for configurations that were handling paths naively, and neglected to normalize the representation before using it test fixtures or for constructing other strings. * The deprecated lang coq has been removed, as scheduled, superseded by lang rocq. See ocaml/dune#12788 for details. See the full changelog for all new features and fixes, and for attribution to the contributors who made it all possible. Thank you, contributors! If you encounter a problem with this release, please report it in our issue tracker.
000
OCaml @ocaml.org · 27/06/2026
dlvr.it
Software Engineer at LexiFi
Software Engineer at LexiFi Location: France, Paris, France
010
OCaml @ocaml.org · 24/06/2026
dlvr.it
Odoc 3.2.1
CHANGES: Fixed * Fix #1426, which broke docs in packages including base in OCaml 5.5.0 (@jonludlam, #1427) * Fix #1429, which broke docs in packages including merlin-lib (@jonludlam, #1430) * Fix #1431, a regression introduced in v3.2.0 (#1433, @jonludlam)
000
OCaml @ocaml.org · 20/06/2026
dlvr.it
Release of OCaml 5.5.0
We have the pleasure of celebrating the birthday of Blaise Pascal by announcing the release of OCaml version 5.5.0. Release Highlights Some of the highlights of OCaml 5.5.0 are: Module-dependent Functions Modules can now be used as function arguments in a form of lightweight functors. For instance, we can define a function for printing a map generated by the Map.Make functor: let pp_map (module M: Map.S) pp_key pp_v ppf set = if M.is_empty set then Format.fprintf ppf "ø" else let pp_sep ppf () = Format.fprintf ppf ",@ " in let pp_binding ppf (k,v) = Format.fprintf ppf "@[%a@ =@ %a@]" pp_key k pp_v v in Format.fprintf ppf "@[{@ %a@ }@]" (Format.pp_print_seq ~pp_sep pp_binding) (M.to_seq set) We can then apply this function on a string map module String_map = Map.Make(String) with let () = let m = String_map.of_list ["Zero", "Zero"; "One", "Un"] in let pp_str = Format.pp_print_string in Format.printf "%a@." (pp_map (module String_map) pp_str pp_str) m Compared to first-class modules, the type of the function pp_map type 'a printer = Format.formatter -> 'a -> unit val pp_map: (module M: Map.S) -> M.key printer -> 'a printer -> 'a M.t printer is dependent over the value of the module S, and thus the function can only applied over a statically known module: let f (): (module Map.S) = if Random.bool () then (module Map.Make(Int)) else (module Map.Make(Float)) let fail = pp_map (f ()) Error: This expression has type (module M : Map.S) -> (Format.formatter -> M.key -> unit) -> (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a M.t -> unit but an expression was expected of type (module Map.S) -> 'b The module M would escape its scope This function is module-dependent. The dependency is preserved when the function is passed a static module argument (module M : S) or (module M). Its argument here is not static, so the type-checker tried instead to change the function type to be non-dependent. Relocatable Compiler A compiler installation can now be moved or copied with no risk of hard-to-debug errors due to mixing incompatible bytecode runtime interpreters. In practice, this means that creating a local switch when there is a global switch with the same compiler version and configuration available can be done by cloning the global switch rather than recompiling the whole compiler. This should considerably reduce the time required to create new local opam switches out-of-the-box. Polymorphic Functions as Function Arguments Higher-rank polymorphic functions can now be defined directly by using an explicit type annotation in a function argument let apply_map (map: 'a 'b. ('a -> 'b) -> 'a list -> 'b list) = map string_of_int [1;2;3], map List.singleton ["x"; "y"] let _ = apply_map List.map Previously defining such a function required going through either a record or an object with a polymorphic field or methods type map = { map: 'a 'b. ('a -> 'b) -> 'a list -> 'b list } let apply_map {map} = map string_of_int [1;2;3], map List.singleton ["x"; "y"] Search and Replace Substring Functions The String module has been extended with many functions for searching and replacing substrings inside a string. let _true = String.includes ~affix:"aba" "abbaba" let sentence = String.replace_all ~sub:"𝄽" ~by:"word" "A 𝄽 is re𝄽ed" The substring search is using the 2-way string matching algorithm which has the advantage of requiring constant space memory overhead independently of the needle size. Generalised Local Definitions It is now always possible to define locally a type, a class, a module type or any kind of item that can be defined globally: let mandelbrot n x = let type t = Converge | Escape of int in ... match orbit n x with | Converge -> 0 | Exit_at n -> colorize n External Types When interfacing with foreign function libraries, it is now possible to define external type type int_gmp = external "mpz_t" type float_gmp = external "mpf_t" Compared to an abstract type definition, the external type name "mpz_t" (resp. mpf_t) makes the type distinguishable from any non-abstract types or external types with a different name. In particular, this makes FFI types better behaved when combined with Generalised Abstract Data Types (GADTs). For instance, The typechecker is able to prove that let ok: (int_gmp,[` A] ) Type.eq -> _ = function _ -> . is a total function because the external type int_gmp is not compatible with a polymorphic variant type. Warning: Abstract types in the current module The astute reader has probably noticed in the definition above that, in OCaml 5.4.0, the typechecker does accept type int_gmp let ok: (int_gmp, [` A] ) Type.eq -> _ = function _ -> . as total. Indeed until OCaml 5.5.0, abstract types defined in the current module type a type b were considered as unique and provably different let f: 'x. (a,b) Type.eq -> 'x = function _ -> . However, this special rule for local definition of abstract types was very brittle. As soon as one moved outside of the current module, it was no longer possible to prove that the types were different. module M = struct type a type b end let fail: 'x. (M.a,M.b) Type.eq -> 'x = function _ -> . Error: This match case could not be refuted. Here is an example of a value that would reach it: Equal This special typechecking rule has been removed in OCaml 5.5.0. If you were relying on it, for instance, because you used an abstract type as type-level label in a GADTs, you can change your abstract type definition to a possibly private abbreviation of a polymorphic variant type a = private [`A] type b = [`B] or a (possibly private) sum type type a = A type b = private B If you were using an abstract type as both a type-level label and a FFI type, you can now use an external type definition which will give you a provably distinct type even outside of the current module. GC improvements Some of the ongoing work to improve the pacing of the garbage collector has been integrated in OCaml 5.5.0, two of the important changes in OCaml 5.5 GC are * the addition of a sweep-only phase at the start of major GC * the addition of an idle phase to smooth the behaviour of the GC at the start. Many incremental changes * The Windows implementation is no more reliant on Winpthreads * Around 60 new standard library functions * Around 90 various improvements * A dozen of documentation updates * Around 40 bug fixes Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discussion forums. The full list of changes can be found in the full changelog. --- Installation Instructions The base compiler can be installed as an opam switch with the following commands: opam update opam switch create 5.5.0 The source code for the release is also directly available on: * GitHub * OCaml archives at Inria Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: opam update opam switch create ocaml-variants.5.5.0+options where is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch: opam switch create 5.5.0+flambda+nffa ocaml-variants.5.5.0+options ocaml-option-flambda ocaml-option-no-flat-float-array
0223
OCaml @ocaml.org · 17/06/2026
dlvr.it
Release of OCaml 4.14.4
We have the pleasure of celebrating the anniversary of the first flight of Ariane 4 by announcing the release of OCaml version 4.14.4. This release is a collection of safe bug fixes, cherry-picked from the OCaml 5 branch. The 4.14 branch is expected to receive updates until at least the end of 2026. However, the end of its extended maintenance period is on the horizon. Consequently, please mention to us any obstacle remaining to your migration to OCaml 5. In the meanwhile, do not hesitate to report any bugs on the OCaml issue tracker. See the list of changes below for more details. --- Installation Instructions The base compiler can be installed as an opam switch with the following commands: opam update opam switch create 4.14.4 The source code for the release candidate is also directly available on: * GitHub * Inria archive
020
OCaml @ocaml.org · 09/06/2026
dlvr.it
Wasm_of_ocaml on WASI: A Working Prototype Looking for a Production User
WASI (the WebAssembly System Interface) lets WebAssembly modules run on standalone runtimes, with no browser or JavaScript host required. That opens the door to running OCaml as serverless functions, edge compute, sandboxed plugins, and portable command-line .wasm binaries. A working WASI backend for wasm_of_ocaml, the compiler that turns OCaml into WebAssembly, already exists. It was authored by Jérôme Vouillon as PR #1831. The prototype works today; the one thing missing is a production user to carry it from branch to release. The good news is that WASI itself is a solved problem here: the backend targets WASI preview1, which essentially every runtime supports. The output already runs fully on the Wizard engine today, and on Wasmtime and Node too, with effects compiled via --effects=cps. What unlocks the rest is engine support catching up across the ecosystem. Wasm GC, tail calls, and exception handling are now standardized in Wasm 3.0, but engine support is still maturing; stack switching (used for OCaml's effects) remains a proposal. These features are landing engine by engine, and as support stabilizes OCaml is poised to target the whole class of standalone Wasm runtimes: serverless functions (e.g. Fermyon Spin), plugin sandboxes (e.g. Shopify Functions), edge compute (e.g. Fastly Compute), and portable CLI .wasm binaries (e.g. Wasmer). Since Spin and Fastly are both built on Wasmtime, progress there carries straight through to those platforms. What works today (on the Branch) Compile an OCaml bytecode program for WASI with --enable wasi: wasm_of_ocaml --enable wasi foo.byte -o foo.js The output is the usual foo.js plus a foo.assets/ directory containing the .wasm binary. Run the binary directly on the Wizard engine: wizeng.x86-64-linux --ext:stack-switching foo.assets/code.wasm The same output also runs on wasmtime. The newer exnref-based exception handling is now the default when producing WASI binaries, so no extra compile-time flags are needed: wasm_of_ocaml --enable wasi foo.byte -o foo.js wasmtime -W=all-proposals=y foo.assets/code.wasm The generated foo.js also works as a Node wrapper that runs the WASI binary under Node's WASI support. CI exercises all three paths: Wizard, wasmtime, and Node. Note that effect-using programs need an explicit effects backend: Wizard runs them compiled with --effects=native, while wasmtime and Node need --effects=cps, since neither yet ships GC-integrated stack switching in a stable build. Under the hood, the PR adds around 5,200 lines across 90 files: a WASI-compatible virtual filesystem (fs.wat), Unix bindings covering file operations, process info, time, and permissions, a small libc in libc.c, WASI memory management and errno mapping, and the Node wrapper. It's substantial work, and it's already standing on its own in CI against real runtimes. Status: prototype, on a branch The original work was done as a feasibility study for Jane Street. They wanted to know whether wasm_of_ocaml could realistically target WASI. The answer is yes, and PR #1831 is the result. The native effects PR #2189 it depended on was merged recently, and as far as we know nobody is running WASI-targeted wasm_of_ocaml in production yet. Funding wanted If your team would benefit from running OCaml on standalone Wasm runtimes, this prototype is much closer to production-ready than the "open PR on a branch" status suggests. Tarides is interested in carrying it forward and would like to hear from organizations that could sponsor the work. Reach out at contact@tarides.com, or start a thread on discuss.ocaml.org. See also: Wasm_of_ocaml: What Changed Since 6.1 for the broader picture of where wasm_of_ocaml is headed, including the dynlink/toplevel and native-effects work that landed or is in flight alongside WASI.
011
OCaml @ocaml.org · 02/06/2026
dlvr.it
Odoc 3.2.1
CHANGES: Fixed * Fix #1426, which broke docs in packages including base in OCaml 5.5.0 (@jonludlam, #1427) * Fix #1429, which broke docs in packages including merlin-lib (@jonludlam, #1430) * Fix #1431, a regression introduced in v3.2.0 (#1433, @jonludlam)
010
OCaml @ocaml.org · 28/05/2026
dlvr.it
Odoc 3.2.0
We're happy to announce the release of Odoc 3.2.0. This release brings: * Support for OCaml 5.5.0 (#1406). * Support for the OxCaml compiler variant (#1399). * Persistent LaTeX macros in the HTML/KaTeX backend (#1391), so a macro defined with \gdef in one math block can be reused in subsequent ones. * Multiple .odocl files accepted by markdown-generate in a single invocation, removing the need for shell scripting around it (#1388). For more details, see the full changelog below.
000
OCaml @ocaml.org · 28/05/2026
dlvr.it
Merlin 5.7.1-504
We're happy to announce the release of Merlin 5.7.1-504, a patch release for the OCaml 5.4 series. This release brings: * A fix for a typer cache invalidation bug (#2062) where Merlin would not pick up newly created .cmi files appearing in the build path, for instance when Dune built a new module. * A change to the on-disk index format (#2051) so that merged indexes can point to existing index files, resulting in significantly smaller index files and fewer write operations. For more details, see the full changelog below.
000
OCaml @ocaml.org · 28/05/2026
dlvr.it
Utop 2.17.0
We're happy to announce the release of utop 2.17.0. This release brings: * Support for OCaml 5.5 (#510). * Decoupling of utop.el from tuareg-mode (#511): tuareg is now loaded lazily, and other OCaml major modes for Emacs (such as neocaml) can integrate with utop via the new utop-mode-compat-alist. Existing tuareg, caml, typerex, and reason users are unaffected. For more details, see the full changelog below.
010
OCaml @ocaml.org · 28/05/2026
dlvr.it
Dune-release 2.2.1
We're happy to announce the release of Dune-release 2.2.1. This release adds a CLI flag to mark a GitHub release as a prerelease, exposing capability that already existed in the GitHub REST API to the dune-release command line (#517). For more details, see the full changelog below.
010
OCaml @ocaml.org · 28/05/2026
dlvr.it
Mdx 2.5.2
We're happy to announce the release of MDX 2.5.2. This is a small compatibility release that adjusts MDX's toplevel support to work with OCaml 5.5. For more details, see the full changelog below.
000
OCaml @ocaml.org · 28/05/2026
dlvr.it
OCamlFormat 0.29.0
We're happy to announce the release of OCamlFormat 0.29.0. CHANGES: Highlight * * Support OCaml 5.5 syntax (#2772, #2774, #2775, #2777, #2780, #2781, #2782, #2783, @Julow) The update brings several tiny changes, they are listed below. * * Update Odoc's parser to 3.0 (#2757, @Julow) The indentation of code-blocks containing OCaml code is reduced by 2 to avoid changing the generated documentation. The indentation within code-blocks is now significative in Odoc and shows up in generated documentation. Added * Added option letop-punning (#2746, @WardBrian) to control whether punning is used in extended binding operators. For example, the code let+ x = x in ... can be formatted as let+ x in ... when letop-punning=always. With letop-punning=never, it becomes let+ x = x in .... The default is preserve, which will only use punning when it exists in the source. This also applies to let%ext bindings (#2747, @WardBrian). * Support the unnamed functor parameters syntax in module types (#2755, #2759, @Julow) module type F = ARG -> S The following lines are now formatted as they are in the source file: module M : (_ : S) -> (_ : S) -> S = N module M : S -> S -> S = N (* The preceding two lines are no longer turned into this: *) module M : (_ : S) (_ : S) -> S = N Fixed * Fix dropped comment in (function _ -> x (* cmt *)) (#2739, @Julow) * * cases-matching-exp-indent=compact does not impact begin end nodes that don't have a match inside. (#2742, @EmileTrotignon) (* before *) begin match () with | () -> begin f x end end (* after *) begin match () with | () -> begin f x end end * Ast_mapper now iterates on all locations inside of Longident.t, instead of only some. (#2737, @v-gb) * Remove line break in M with module N = N (* cmt *) (#2779, @Julow) Internal * Added information on writing tests to CONTRIBUTING.md (#2838, @WardBrian) Changed * indentation of the end keyword in a match-case is now always at least 2. (#2742, @EmileTrotignon) (* before *) begin match () with | () -> begin match () with | () -> () end end (* after *) begin match () with | () -> begin match () with | () -> () * * use shortcut begin end in match cases and if then else body. (#2744, @EmileTrotignon) (* before *) match () with | () -> begin match () with | () -> end end (* after *) match () with | () -> begin match () with | () -> end end * * Set the ocaml-version to 5.4 by default (#2750, @EmileTrotignon) The main difference is that the effect keyword is recognized without having to add ocaml-version=5.3 to the configuration. In exchange, code that use effect as an identifier must use ocaml-version=5.2. * The work to support OCaml 5.5 come with several improvements: * Improve the indentation of let structure-item with the [@ocamlformat "disable"] attribute. let structure-item means let module, let open, let include and let exception. * (let open M in e)[@a] is turned into let[@a] open M in e. * Long let open ... in no longer exceed the margin. * Improve indentation of let structure-item within parentheses: (* before *) (let module M = M in M.foo) (* after *) (let module M = M in M.foo)
000
OCaml @ocaml.org · 28/05/2026
dlvr.it
OCaml 5.5.0-beta1
With most developer tools available and the good stability of the compiler, I am happy to announce the first beta release of OCaml 5.5.0. Compared to the last alpha, this new version improves the manpage for ocamlopt and fixes: * two runtime bugs (for ephemerons and the bytecode interpreter) * two type system bugs (for classes and module-dependent functions) * three warning or error message bugs (See the Changelog below for a full list). Concerning the associated compiler tools, most of them are already available (as least in a preview version), and there are patches in progress for the remaining ones. You can track the last remaining update efforts on the release readiness meta-issue. Thus, it should be safe to test your libraries and programs with the new version OCaml 5.5.0 version in preparation of the final release. If everything goes well, we might see a release in May. If you find any bugs, please report them to the GitHub issue tracker. If you are interested by the full list of new features and bug fixes, the changelog for OCaml 5.5.0 is the most up-to-date resource. Happy hacking, Florian Angeletti for the OCaml team. --- Installation Instructions The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: opam update opam switch create 5.5.0~beta1 The source code for the beta is also available at these addresses: * GitHub: https://github.com/ocaml/ocaml/archive/5.5.0-beta1.tar.gz * OCaml archives at Inria: https://caml.inria.fr/pub/distrib/ocaml-5.5/ocaml-5.5.0~beta1.tar.gz Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: opam update opam switch create ocaml-variants.5.5.0~beta1+options where option_list is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch: opam switch create 5.5.0~beta1+flambda+nffa ocaml-variants.5.5.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array All available options can be listed with opam search ocaml-option. --- Changes compared to the last alpha Documentation update * #14684: Improve ocamlopt's manual page (Samuel Hym, review by Florian Angeletti) Runtime fixes * #14644, #14647: Fix a bug related to unhandled effects in bytecode. (Vincent Laviron, report by Thibaut Mattio, review by Nicolás Ojeda Bär, Stephen Dolan and Olivier Nicole) * #14349, #14718: runtime, fix in the orphaning of ephemerons (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Jan Midtgaard) Type system fixes * #14557, #12150, #14696: ensure that the self type of class cannot escape through type constraints. (Leo White, review by Florian Angeletti) * #14667: enable application related warnings for module-dependent functions (Florian Angeletti, review by Gabriel Scherer) Error messages and warning fixes * #14690: Fix Name_type_mismatch error message when the expected type is an alias: print the expanded path on the right-hand side of the equality, not the alias twice. (Weixie Cui, review by Florian Angeletti) * #14719, #14721: compute arity correctly for module-dependent function (Florian Angeletti, report by Jeremy Yallop, review by Stefan Muenzel) * #14655, #14691: check for size overflow in caml_ba_reshape (Stephen Dolan, review by Xavier Leroy)
020
OCaml @ocaml.org · 28/05/2026
dlvr.it
OCaml-LSP 1.26.0-5.5~preview
A preview release of OCaml-LSP for the OCaml 5.5 series is available. Notable changes: * A new destruct custom request (#1583), intended to let clients such as ocaml-eglot trigger the command directly rather than through a code action. * Configurable Merlin via build systems other than dune, through the OCAMLLSP_PROJECT_BUILD_SYSTEM and OCAMLLSP_PROJECT_ROOT environment variables (#1581). * Long signatures returned by signature-help are now formatted with ocamlformat for improved readability (#1580). For more details, see the full changelog below.
020
OCaml @ocaml.org · 23/05/2026
for more context see discuss.ocaml.org/t/ann-ocaml-users…
discuss.ocaml.org
[ANN] OCaml Users Survey 2026
The survey is only open until May 25, 2026, so if you haven’t taken it, please do it now!
020
OCaml @ocaml.org · 23/05/2026
docs.google.com/forms/d/e/1FAIpQLSe…
docs.google.com
OCaml Users Survey 2026
This survey is configured to not use an existing Google Account to save your progress (which will be lost if you close your browser or click the back button before finishing the survey). None of the questions are mandatory. Please do not enter any personal information in the free-form text fields as the summary of the results and the raw data will be made available to the community (we will of course redact any personal information we detect, but we may still miss some). As an official OCaml online space, this survey has adopted the OCaml Code of Conduct. The free-form text fields are provided to gather constructive feedback from the community. Any comment that is a clear violation of the CoC will be expunged from the results before making them publicly available. Thank you in advance for your participation! This survey will be accepting answers until May 25th 2026 (AOE).
130
OCaml @ocaml.org · 23/05/2026
please participate in the OCaml Users Survey 2026, still open until and including May 25, 2026! link below
141
OCaml @ocaml.org · 20/05/2026
dlvr.it
Dune 3.23.1
The Dune team is pleased to announce the release of dune 3.23.1. This is a patch release consisting of bug fixes. See the full changelog for all the changes and for attribution to the contributors who made it all possible. Thank you, contributors! If you encounter a problem with this release, please report it in our issue tracker.
010
OCaml @ocaml.org · 19/05/2026
dlvr.it
Senior Systems Software Engineer at Cloud Software Group
Senior Systems Software Engineer at Cloud Software Group Location: Remote, United Kingdom
000
OCaml @ocaml.org · 15/05/2026
dlvr.it
OCaml-LSP 1.26.0
This new release of OCaml-LSP brings several new features and improvements, including new custom requests, support for range formatting, and enhanced hover capabilities. See the related announcement on the Discuss forums.
011
OCaml @ocaml.org · 15/05/2026
dlvr.it
Merlin 5.7.0-504
We're happy to announce the release of Merlin 5.7.0-504. This release comes with a number of bug fixes and improvements to Merlin. For more details, we encourage you to delve into the full changelog. See the related announcement on the Discuss forums.
010
OCaml @ocaml.org · 07/05/2026
dlvr.it
Odoc 3.2.0
CHANGES: Added * Allow persistent latex macros in HTML/KaTeX backend (@dlesbre, #1391) * markdown-generate command now accepts multiple .odocl files in a single invocation, eliminating the need for shell scripting (@davesnx, #1387) * Support for OxCaml (@lukemaurer, @art-w, #1399) * OCaml 5.5.0 support (@panglesd, @xvw, #1406) Fixed * Fix compile-time crashing bugs #930 and #1385 (@jonludlam, #1400) * Markdown backend assumes ocaml as langId on declarations * Markdown backend collects all code snippets and render a single code block with comments, rather than split the variants/records per constructor/field * Fix URL remapping for page references (@jonludlam, #1395) * Fix #1396, which broke incrememntal builds (@jonludlam, #1402) * Ensure all warnings turn into errors with --warn-error (@jonludlam, #1402) * Fix missing parentheses for polymorphic arguments (@art-w, #1404)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Merlin 5.7.1-504
CHANGES: Thu Apr 30 14:15:42 CEST 2026 * merlin library * Fix a cache invalidation issue due to the introduction of hidden deps in OCaml 5.2. (#2062) * index format * Merged indexes now point to each-others. This results in smaller index files. The index of a project is now defined by all its index files, not only the final aggregation. (#2051)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Merlin 5.7.0-504
CHANGES: Thu Apr 09 09:59:38 WAT 2026 * merlin library * Implement new refactor-extract-region command for extracting region to a fresh let binding (warning: this feature is still experimental) (#1948) * Add "Other" variant to locate-types result (#2025) * Don't include option in locate-types result for optional parameters (#2027) * Fix record field autocompletion (#2028) * Signature help should not loop over the parameters once it is finished (#2023) * Fix bugs on signature help about labelled and optional parameters (#2032) * Add -end-position parameter for enclosing (#2029) * Signature help should appear even if the 'in' is not written (#2036) * Improve type enclosing behavior on various class and object related items (#2053) * merlin binary * Define PATH_MAX to 4096 if undefined (eg. hurd) (#2039) * test suite * Add a reproduction case for #1214, the issue has been resolved before (#2022) * Add reproduction case for #1763 but it is not failing anymore (#2021) * Add a test to reproduce Locate command fails on multi-line type definitions (#2020) * Add a regression test for issue #2019 (#2030)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Utop 2.17.0
CHANGES: * Add support for OCaml 5.5 (#510 @anmonteiro) * Add support for neocaml or other major modes in utop.el (#511, @bbatsov)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Dune-release 2.2.1
CHANGES: Added * Add support for marking a release as a prerelease. (#517, @Sudha247)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Mdx 2.5.2
CHANGES: Added * Support OCaml 5.5 (#475, @anmonteiro)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
OCamlFormat 0.29.0
CHANGES: Highlight * * Support OCaml 5.5 syntax (#2772, #2774, #2775, #2777, #2780, #2781, #2782, #2783, @Julow) The update brings several tiny changes, they are listed below. * * Update Odoc's parser to 3.0 (#2757, @Julow) The indentation of code-blocks containing OCaml code is reduced by 2 to avoid changing the generated documentation. The indentation within code-blocks is now significative in Odoc and shows up in generated documentation. Added * Added option letop-punning (#2746, @WardBrian) to control whether punning is used in extended binding operators. For example, the code let+ x = x in ... can be formatted as let+ x in ... when letop-punning=always. With letop-punning=never, it becomes let+ x = x in .... The default is preserve, which will only use punning when it exists in the source. This also applies to let%ext bindings (#2747, @WardBrian). * Support the unnamed functor parameters syntax in module types (#2755, #2759, @Julow) module type F = ARG -> S The following lines are now formatted as they are in the source file: module M : (_ : S) -> (_ : S) -> S = N module M : S -> S -> S = N (* The preceding two lines are no longer turned into this: *) module M : (_ : S) (_ : S) -> S = N Fixed * Fix dropped comment in (function _ -> x (* cmt *)) (#2739, @Julow) * * cases-matching-exp-indent=compact does not impact begin end nodes that don't have a match inside. (#2742, @EmileTrotignon) (* before *) begin match () with | () -> begin f x end end (* after *) begin match () with | () -> begin f x end end * Ast_mapper now iterates on all locations inside of Longident.t, instead of only some. (#2737, @v-gb) * Remove line break in M with module N = N (* cmt *) (#2779, @Julow) Internal * Added information on writing tests to CONTRIBUTING.md (#2838, @WardBrian) Changed * indentation of the end keyword in a match-case is now always at least 2. (#2742, @EmileTrotignon) (* before *) begin match () with | () -> begin match () with | () -> () end end (* after *) begin match () with | () -> begin match () with | () -> () * * use shortcut begin end in match cases and if then else body. (#2744, @EmileTrotignon) (* before *) match () with | () -> begin match () with | () -> end end (* after *) match () with | () -> begin match () with | () -> end end * * Set the ocaml-version to 5.4 by default (#2750, @EmileTrotignon) The main difference is that the effect keyword is recognized without having to add ocaml-version=5.3 to the configuration. In exchange, code that use effect as an identifier must use ocaml-version=5.2. * The work to support OCaml 5.5 come with several improvements: * Improve the indentation of let structure-item with the [@ocamlformat "disable"] attribute. let structure-item means let module, let open, let include and let exception. * (let open M in e)[@a] is turned into let[@a] open M in e. * Long let open ... in no longer exceed the margin. * Improve indentation of let structure-item within parentheses: (* before *) (let module M = M in M.foo) (* after *) (let module M = M in M.foo)
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Opam-publish 3.0.0
CHANGES: * No longer allow option names to be specified by a prefix if the prefix is unambiguous [#202 @kit-ty-kate] * Query upstream repo for default branch instead of defaulting to master [#201 @mbarbin] * Query fork name from GitHub to support users whose fork of opam-repository isn't named opam-repository [#199 @mbarbin] * Fix an infinit loop if the user repeatedly provided an invalid token [#186 @filipeom] * Remove the deprecated --split option [#194 @kit-ty-kate] * Remove the github-unix dependency [#196 @kit-ty-kate] * Upgrade to cmdliner 2.0 [#202 @kit-ty-kate]
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
OCaml 5.5.0-beta1
release 5.5.0~beta1
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
OCaml 5.5.0-alpha2
release 5.5.0~alpha2
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
OCaml-LSP 1.26.0-5.5~preview
CHANGES: Fixes * Improve the readability of signature-help for long signatures (#1580) Features * Add destruct custom request (#1583) * Allow to configure merlin using build systems other than dune. If $OCAMLLSP_PROJECT_BUILD_SYSTEM environment variable is set then OCaml LSP will execute $OCAMLLSP_PROJECT_BUILD_SYSTEM ocaml-merlin command to get merlin configuration for a module. It is expected the command to communicate using merlin-dot-protocol. If $OCAMLLSP_PROJECT_ROOT environment variable is set then OCaml LSP will use it as a project root directory.
000
OCaml @ocaml.org · 07/05/2026
dlvr.it
Merlin 5.7-505~preview
CHANGES: * merlin library * Add "Other" variant to locate-types result (#2025) * Don't include option in locate-types result for optional parameters (#2027) * Fix record field autocompletion (#2028) * Signature help should not loop over the parameters once it is finished (#2023) * tests * Add a reproduction case for #1214, the issue has been resolved before (#2022) * Add reproduction case for #1763 but it is not failing anymore (#2021) * Add a test to reproduce Locate command fails on multi-line type definitions (#2020) * Add a regression test for issue #2019 (#2030)
000
OCaml @ocaml.org · 06/05/2026
dlvr.it
Dune 3.23.0
The Dune team is pleased to announce the release of dune 3.23.0. Along with many other fixes and improvements, some highlights include: * Add support for c_library_flags in foreign_stubs (#13484, @madroach) * Many improvements to the promotion and diffing functionality, by @rgrinberg. * As part of the previous, a breaking change to the promotion logic has been introduced: Dune does not automatically promote generated opam files, which must now be manually promoted with dune promote. You can trigger building .opam files with the @install, @runtest, and @opam aliases. In release mode, .opam files aren't generated at all and whatever is in the source is used (ocaml/dune#14108, @rgrinberg). * User rules and inline test runners are now sandboxed by default (ocaml/dune#13805 and ocaml/dune#14257, @rgrinberg). * The minimum OCaml version required to build dune is now 4.14. See the full changelog for all new features and fixes, and for attribution to the contributors who made it all possible. Thank you, contributors! If you encounter a problem with this release, please report it in our issue tracker.
000
OCaml @ocaml.org · 30/04/2026
discuss.ocaml.org/t/ann-ocaml-users…
discuss.ocaml.org
[ANN] OCaml Users Survey 2026
Hi everyone, On behalf of the OCaml Software Foundation (OCSF), I’m delighted to announce the OCaml Users Survey 2026. We invite you to take 10 to 15 minutes to fill it out and to share it with other OCaml programmers. Survey link: OCaml Users Survey 2026 The survey will remain open until May 25th, 2026 (AOE). This year’s edition builds on the 2023 iteration. Many questions are kept comparable so we can track trends over time, while others have been refreshed, fixed, or added based on comm...
020
OCaml @ocaml.org · 30/04/2026
The OCaml Users Survey 2026 is now open! 📊 Share your experience with OCaml - from tools you use to new questions on AI/LLM tooling and debugging. Takes 10-15 minutes, open until May 25th. forms.gle/gt5nikqUmoQWeYYQ9
178
OCaml @ocaml.org · 22/04/2026
www.chrisarmstrong.dev/posts/ocgtk-…
chrisarmstrong.dev
ocgtk preview1 now on opam
ocgtk, a set of GTK4 bindings for OCaml, is now available on opam as preview1 release
010
OCaml @ocaml.org · 22/04/2026
[OCaml Planet AI] Chris Armstrong released ocgtk preview1 - a set of GTK4 bindings now installable through opam. This brings GTK4's latest UI capabilities to OCaml projects.
120
OCaml @ocaml.org · 18/04/2026
New VSCode walkthrough makes OCaml installation straightforward. The guide walks you through setting up OCaml with opam directly in your editor. tarides.com/blog/2026-04-16-vscode-…
041
OCaml @ocaml.org · 17/04/2026
dlvr.it
Ppxlib 0.38.0
The ppxlib team is happy to announce the release of ppxlib.0.38.0. The main features of this release are support for OCaml 5.5 and improved support of OCaml 5.4 and 5.3. It also comes with a few bug fixes and a couple new API entries, you can read the extensive release notes here. This is our first release since we announced our new approach to supporting new compilers in this thread. All support for compilers versions >= 5.3 is implemented using this technique and new language features are encoded into the AST. We've added Ast_builder and Ast_pattern functions to allow you to manipulate some of those, such as labeled tuples or effect patterns. You can see those in our API documentation here and there. We've also illustrated how to use them in our new manual section. If you're interested in producing or consuming other new language features that cannot be represented with our current internal AST (5.2), please open an issue so we can add the relevant helpers. Given the ecosystem hasn't yet recovered from the 5.2 AST bump and ppxlib.0.36.0, we're glad that we can add support for new compilers without introducing further breakage and keep the maintenance burden within ppxlib's bounds. We've started discussions with the compiler team to make this approach even more viable in the future on our end. We'd like to thank @ceastlund who's our only external contributor for this release. I'd personally like to thank @patricoferris for his help getting this out the door as well as the OCaml Software Foundation and OCamlPro for funding my work on ppxlib. Thank you for reading and happy preprocessing! You can comment on this announcement on the OCaml discuss forums.
000
OCaml @ocaml.org · 17/04/2026
dlvr.it
OCaml 5.5.0 - Third Alpha
With the progress of the ongoing stabilisation effort for OCaml 5.5.0, we are happy to announce a third alpha release for OCaml 5.5.0. The missing second alpha was unreleased due to an unforeseen interaction between the relocatable compiler and bootstrapping. This issue is fixed in this third alpha. Beyond this important change, compared to the first alpha this new alpha release contains * two code generation fixes * three type system fixes * one standard library fix (see the Changelog below for a full list). Overall, it looks like 5.5.0 is stabilizing quite well and alpha versions of most development tools are available. Thus we are planning to switch to a beta release in the beginning of April. More precisely, the ongoing progress on stabilising the ecosystem is tracked on the 5.5.0 readiness meta-issue on opam. There is also a companion alpha opam repository available for this alpha release $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-repository.git which contains in-progress alpha releases of opam packages that are being updated for OCaml 5.5.0. The final release is still planned for between May and June. If you find any bugs, please report them on the issue tracker. If you are interested by the full list of new features and bug fixes, the updated changelog for OCaml 5.5.0 is available. Happy hacking, Florian Angeletti for the OCaml team Changes compared to the first alpha Compiler artefact fixes * More bootstrap-friendly relocatable compiler * A bootstrap to fix compiler-libs related issues reported by js_of_ocaml Code generation bug fixes * #14583: fix bug in linear scan spilling heuristic that in certain situations could lead to miscompilations. (Nicolás Ojeda Bär, review by Vincent Laviron) * #13693, #14514: s390x: fix heap corruption with libasmrun_shared.so caused by PLT lazy binding trampoline saving FPRs into OCaml's fiber stack. Replace @PLT calls with GOT-indirect calls in the s390x code emitter. (Zane Hambly, review by David Allsopp and Xavier Leroy) Type system bug fixes * #14434, #14652: Protect check_counter_example_pat against polymorphic types, restoring type soundness. (Stephen Dolan and Jacques Garrigue, report and review by Alistair O'Brien) * #14603, #14604: avoid Ctype.apply failures when mixing polymorphic types and unboxed constructors. (Gabriel Scherer and Stefan Muenzel, report by Brandon Stride, review by Florian Angeletti) * #14626, #14675: take in account module-dependent functions when determining if an optional argument is non-erasable. (Alistair O'Brien and Florian Angeletti, review by Gabriel Scherer) Standard library fix * #14635: Fix a bug in caml_floatarray_gather that would cause the result of Float.Array.sub, Float.Array.append, Float.Array.concat (when empty) not to be equal to [||]. (Marc Lasson, review by Gabriel Scherer) Documentation update * #13590: Document automatic command-line expansion of * and ? wildcards by the runtime under Windows. (Benjamin Sigonneau, review by Nicolás Ojeda Bär) You can comment on this announcement on the OCaml discuss forums.
000
OCaml @ocaml.org · 17/04/2026
dlvr.it
OCaml 5.5.0 - First Alpha
Four months after the release of OCaml 5.4.0, the set of new features for the future version 5.5.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.5.0. This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions). More information about the release process is available at ocaml/release-info/introduction.md at trunk. The progress on stabilising the ecosystem is tracked on the opam readiness for 5.5.0 meta-issue. There is also a companion alpha opam repository available for this alpha release $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-repository.git which contains in-progress alpha releases of opam packages that are being updated for OCaml 5.5.0. The full release is expected between May and June. There are more information available in the prospective release calendar. If you find any bugs, please report them on the OCaml's issue tracker. If you are interested in the ongoing list of new features and bug fixes, the updated change log for OCaml 5.5.0 is available on GitHub. Happy hacking, Florian Angeletti for the OCaml team Installation Instructions The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: opam update opam switch create 5.5.0~alpha1 The source code for the alpha is also available at these addresses: * GitHub: https://github.com/ocaml/ocaml/archive/5.5.0-alpha1.tar.gz * OCaml archives at Inria: https://caml.inria.fr/pub/distrib/ocaml-5.5/ocaml-5.5.0~alpha1.tar.gz Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: opam update opam switch create ocaml-variants.5.5.0~alpha1+options where option_list is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch: opam switch create 5.5.0~alpha1+flambda+nffa ocaml-variants.5.5.0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array All available options can be listed with opam search ocaml-option. You can comment on this announcement on the OCaml discuss forums.
000
OCaml @ocaml.org · 17/04/2026
[OCaml Planet AI] New Mollymawk capabilities: managing heterogeneous VM setups where MirageOS unikernels interact with other VMs. Bridges the gap between experimental unikernels and production deployment requirements. blog.robur.coop/articles/mollymawk-…
blog.robur.coop
Robur's blog - Mollymawk supporting other virtual machines
020