<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/default.xsl"?>
<fr:tree xmlns:fr="http://www.forester-notes.org" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" root="false" base-url="/">
  <fr:frontmatter>
    <fr:authors>
      <fr:author>
        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
      </fr:author>
    </fr:authors>
    <fr:date>
      <fr:year>2026</fr:year>
      <fr:month>2</fr:month>
      <fr:day>9</fr:day>
    </fr:date>
    <fr:uri>https://patrick.sirref.org/merry/</fr:uri>
    <fr:display-uri>merry</fr:display-uri>
    <fr:route>/merry/</fr:route>
    <fr:title text="Merry">Merry</fr:title>
    <fr:meta name="external">https://tangled.org/patrick.sirref.org/merry</fr:meta>
  </fr:frontmatter>
  <fr:mainmatter>
    <html:p>Merry is a library for building POSIX-ish shells in OCaml. It comes with a  <![CDATA[(work-in-progress) POSIX shell written using]]><fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> called  <html:code>msh</html:code>. </html:p>
    <html:p>Supporting the full  <fr:link href="https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/" type="external">POSIX  specification </fr:link> is no easy feat, however,  <html:code>msh</html:code> already  <fr:link href="https://tangled.org/patrick.sirref.org/merry/tree/main/test" type="external">supports plenty of the more useful  bits of the spec </fr:link>. </html:p>
  </fr:mainmatter>
  <fr:backmatter>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="References">References</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Context">Context</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Backlinks">Backlinks</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>4</fr:month>
              <fr:day>3</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/weekly-2026-w14/</fr:uri>
            <fr:display-uri>weekly-2026-w14</fr:display-uri>
            <fr:route>/weekly-2026-w14/</fr:route>
            <fr:title text="Forking in Shells &amp; Library Maintenance">Forking in Shells &amp; Library Maintenance</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>This week,  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> got close to executing  <html:code>apt-get install ca-certificates</html:code> and running Debian's  <html:code>debootstrap</html:code> scripts correctly.  <fr:link href="https://patrick.sirref.org/nathan/" type="external">Nathan </fr:link> and I released  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib </fr:link>  <html:code>0.38.0</html:code>, I added support to  <fr:link href="https://github.com/geocaml/ocaml-proj" type="external">ocaml-proj </fr:link> for compiling to the  browser and I fixed a long-standing bug in  <fr:link href="https://github.com/patricoferris/hilite" type="external">hilite </fr:link>. </html:p>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>3</fr:day>
                </fr:date>
                <fr:title text="Forking in Merry ">Forking in Merry </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>So far,  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> has managed to support many features of the POSIX shell  specification without needing to do a  <html:code><![CDATA[fork(2)]]></html:code> without an  <html:code>exec</html:code>. Or, to put  it another way, all the forking that  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> does, will only be followed by  running C code. This is actually a feature of  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link>'s  <html:code>Process</html:code> API. It is  required to make process execution safe in the context of multiple domains in  <![CDATA[OCaml (mostly due to ensuring consistency within the garbage collector).]]> However, it is perfectly okay to  <html:code>fork</html:code> and run OCaml code provided there is  only a single domain. </html:p>
                <html:p><![CDATA[In a shell, many features of the shell language require that commands (or]]> <![CDATA[built-ins, function applications etc.) execute within a]]><html:code>subshell</html:code>. The  specification does not go into detail about how shells should implement this,  but many choose to  <html:code>fork</html:code><![CDATA[ in order to preserve some state in the parent (for]]> <![CDATA[example, the file descriptor table). Some shells try to minimise the number of]]> forks as an optimisation. The  <fr:link href="/korn1996korn/" title="The New Korn Shell" uri="https://patrick.sirref.org/korn1996korn/" display-uri="korn1996korn" type="local"><![CDATA[korn shell (ksh)]]></fr:link> is one such  shell. </html:p>
                <html:blockquote>
                  <html:p>Using the notation  <html:code><![CDATA[$(command)]]></html:code> will cause  <html:code>command</html:code> to execute in a subshell  of the current ksh. In many instances, ksh will not actually fork/exec a  subshell when command is a built-in or a shell function. </html:p>
                </html:blockquote>
                <html:p>By trying to adhere to Multicore OCaml's " <html:em>thou shalt not fork </html:em>" commandment,  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> is much more similar to  <html:code>ksh</html:code> in this regard. However, whenever there is  an interaction with a shell built-in and semantics that need a child process,  things get tricky very quickly. Consider the following: </html:p>
                <html:pre class="hilite">
                  <html:code>
                    <html:span class="sh-keyword-control">while</html:span>
                    <html:span class="sh-meta-scope-while-loop"> </html:span>
                    <html:span class="sh-support-function-builtin">echo</html:span>
                    <html:span class="sh-meta-scope-while-loop"> </html:span>
                    <html:span class="sh-punctuation-definition-string-begin">"</html:span>
                    <html:span class="sh-string-quoted-double">hello</html:span>
                    <html:span class="sh-punctuation-definition-string-end">"</html:span>
                    <html:span class="sh-keyword-operator-list">;</html:span>
                    <html:span class="sh-meta-scope-while-loop"> </html:span>
                    <html:span class="sh-keyword-control">do</html:span>
                    <html:span class="sh-meta-scope-while-loop">
</html:span>
                    <html:span class="sh-meta-scope-while-loop">  </html:span>
                    <html:span class="sh-support-function-builtin">:</html:span>
                    <html:span class="sh-meta-scope-while-loop">
</html:span>
                    <html:span class="sh-keyword-control">done</html:span>
                    <html:span class="sh-source"> </html:span>
                    <html:span class="sh-keyword-operator-pipe">|</html:span>
                    <html:span class="sh-source"> head -n 3
</html:span>
                  </html:code>
                </html:pre>
                <html:p><![CDATA[We have a mix of shell built-ins, normal commands, a compound command (the]]> <html:code>while</html:code><![CDATA[ loop) and a pipeline. Each individual command in the pipeline requires]]> you to run them in a subshell and set them up  <html:em>before </html:em> executing them. Without  a  <html:code>fork</html:code> for that first command, you may end up looping forever which is not  the intended behaviour here. I had a good conversation with  <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael </fr:link> about the implications of this for reproducibility. </html:p>
                <html:p>For now, I have started implementing a  <html:code>fork</html:code> for some of the shell features whilst  still trying to maintain the functional core of the implementation. </html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>3</fr:day>
                </fr:date>
                <fr:title text="An OCaml 5.5 compatible Ppxlib ">An OCaml 5.5 compatible Ppxlib </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan </fr:link> and I released an OCaml 5.5 compatible version of  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link>. </html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://patrick.sirref.org/ppxlib-release-0-38-0/</fr:uri>
                    <fr:display-uri>ppxlib-release-0-38-0</fr:display-uri>
                    <fr:route>/ppxlib-release-0-38-0/</fr:route>
                    <fr:title text="Ppxlib Releases › 0.38.0  "><fr:link href="/ppxlib-releases/" title="Ppxlib Releases" uri="https://patrick.sirref.org/ppxlib-releases/" display-uri="ppxlib-releases" type="local">Ppxlib Releases</fr:link> › 0.38.0  </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan </fr:link> and I  <fr:link href="https://github.com/ocaml/opam-repository/pull/29563" type="external">released  ppxlib.0.38.0 </fr:link> last week.  Its main feature is full  <html:em>migration </html:em> support for the upcoming OCaml 5.5  <![CDATA[compiler (currently in its]]><html:code>alpha3</html:code><![CDATA[ release). This means supporting the handful]]> of new features landing in OCaml 5.5:  <fr:link href="/modular-explicits/" title="Modular Explicits in OCaml" uri="https://patrick.sirref.org/modular-explicits/" display-uri="modular-explicits" type="local">modular explicits </fr:link>,  external type declarations and arbitrary "local" structure items. </html:p>
                    <html:p>As  <fr:link href="https://patrick.sirref.org/nathenreb/" type="external">Nathan </fr:link> and I continue to find a plausible maintenance story for  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link>,  <fr:link href="https://patrick.sirref.org/nathenreb/" type="external">Nathan </fr:link> has opened  <fr:link href="https://github.com/ocaml/ocaml/issues/14668" type="external">an issue on the OCaml compiler to  discuss the idea of adding additional extension points to the  language </fr:link>. </html:p>
                    <html:p>This comes from the desire to be able to store encoded versions of new OCaml  features inside older abstract syntax trees. </html:p>
                    <html:p>There are also some nice bug fixes in there too: </html:p>
                    <html:ul>
                      <html:li>
                        <html:p><fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/613" type="external">A potential OOM </fr:link> loop has now been removed. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>
                          <fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/619" type="external">Locations have been restored to long identifiers! </fr:link>
                        </html:p>
                      </html:li>
                    </html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>3</fr:day>
                </fr:date>
                <fr:title text="Browser support for ocaml-proj ">Browser support for ocaml-proj </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A while ago  <fr:link href="https://github.com/geocaml/ocaml-proj" type="external">I built some "modern" bindings to PROJ4 in  OCaml </fr:link>. After reading  <fr:link href="https://patrick.sirref.org/jonludlam/" type="external">Jon  Ludlam </fr:link>'s  <fr:link href="https://jon.recoil.org/blog/2026/03/weeknotes-2026-12.html" type="external">weeknotes </fr:link><![CDATA[ (and]]> speaking with him and  <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil </fr:link>, I thought it might be nice to  add a Javascript backend to those bindings. This was relatively  straight-forward using  <fr:link href="https://dune.readthedocs.io/en/stable/virtual-libraries.html" type="external">Dune's virtual  libraries </fr:link> and is  <fr:link href="https://github.com/geocaml/ocaml-proj/blob/main/src/js/proj.ml" type="external">available on  Github </fr:link>. </html:p>
                <html:p><![CDATA[With virtual libraries, your own data analysis could (if you wished) depend]]> solely on the  <html:code>proj</html:code> library and later choose to either link it with  <html:code>proj.c</html:code> or  <html:code>proj.js</html:code> depending on where the analysis is being deployed. </html:p>
                <html:p>I briefly looked at WASM support, but quickly realised there was not much  appetite for it and trying to compile around the C FFI was going to be hard. </html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>3</fr:day>
                </fr:date>
                <fr:title text="Hilite updates ">Hilite updates </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Since I helped  <fr:link href="https://ocaml.org/" type="external">relaunch the ocaml.org </fr:link> website a few years ago,  I have maintained  <fr:link href="https://github.com/patricoferris/hilite" type="external">hilite </fr:link>, a tool for doing  build-time syntax highligting. </html:p>
                <html:p>It is being used on the  <fr:link href="https://ocaml.org/" type="external">ocaml.org </fr:link> website,  <fr:link href="https://github.com/xhtmlboi/yocaml/blob/45858f4b25730149dae3735e7fcdb9111ac1f9eb/yocaml_markdown.opam#L18" type="external">in  yocaml_markdown </fr:link> and also in  <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael's </fr:link> <fr:link href="https://github.com/mdales/webplats/blob/cf0ea95a66bae52f02a00739eb02564fc94183ee/webplats.opam#L19" type="external">webplats </fr:link> <![CDATA[(when it works...).]]></html:p>
                <html:p>And it was  <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael </fr:link> who led me to finally fixing and adding syntax  highlighting support for Python and Go. Once I was on this roll, I finally took a look  at fixing the long-standing bug of trying to highlight ocaml-mdx code, like the following: </html:p>
                <html:pre class="hilite">
                  <html:code>
                    <html:span class="ocaml-mdx-hash">#</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-float">50.123</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-mdx-hash">#</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">1</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-string-quoted-double">"</html:span>
                    <html:span class="ocaml-string-quoted-double">file.ml</html:span>
                    <html:span class="ocaml-string-quoted-double">"</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-source">
</html:span>
                  </html:code>
                </html:pre>
                <html:p>In fact, this code now highlights fine, but was the source of the bug. The  syntax highlighting grammer confuses the ocaml-mdx  <html:code>#</html:code> as a toplevel directive  and trouble ensues. </html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>3</fr:month>
              <fr:day>30</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/weekly-2026-w13/</fr:uri>
            <fr:display-uri>weekly-2026-w13</fr:display-uri>
            <fr:route>/weekly-2026-w13/</fr:route>
            <fr:title text="Ppxlib release and Merry updates">Ppxlib release and Merry updates</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://patrick.sirref.org/ppxlib-release-0-38-0/</fr:uri>
                <fr:display-uri>ppxlib-release-0-38-0</fr:display-uri>
                <fr:route>/ppxlib-release-0-38-0/</fr:route>
                <fr:title text="Ppxlib Releases › 0.38.0  "><fr:link href="/ppxlib-releases/" title="Ppxlib Releases" uri="https://patrick.sirref.org/ppxlib-releases/" display-uri="ppxlib-releases" type="local">Ppxlib Releases</fr:link> › 0.38.0  </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan </fr:link> and I  <fr:link href="https://github.com/ocaml/opam-repository/pull/29563" type="external">released  ppxlib.0.38.0 </fr:link> last week.  Its main feature is full  <html:em>migration </html:em> support for the upcoming OCaml 5.5  <![CDATA[compiler (currently in its]]><html:code>alpha3</html:code><![CDATA[ release). This means supporting the handful]]> of new features landing in OCaml 5.5:  <fr:link href="/modular-explicits/" title="Modular Explicits in OCaml" uri="https://patrick.sirref.org/modular-explicits/" display-uri="modular-explicits" type="local">modular explicits </fr:link>,  external type declarations and arbitrary "local" structure items. </html:p>
                <html:p>As  <fr:link href="https://patrick.sirref.org/nathenreb/" type="external">Nathan </fr:link> and I continue to find a plausible maintenance story for  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link>,  <fr:link href="https://patrick.sirref.org/nathenreb/" type="external">Nathan </fr:link> has opened  <fr:link href="https://github.com/ocaml/ocaml/issues/14668" type="external">an issue on the OCaml compiler to  discuss the idea of adding additional extension points to the  language </fr:link>. </html:p>
                <html:p>This comes from the desire to be able to store encoded versions of new OCaml  features inside older abstract syntax trees. </html:p>
                <html:p>There are also some nice bug fixes in there too: </html:p>
                <html:ul>
                  <html:li>
                    <html:p><fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/613" type="external">A potential OOM </fr:link> loop has now been removed. </html:p>
                  </html:li>
                  <html:li>
                    <html:p>
                      <fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/619" type="external">Locations have been restored to long identifiers! </fr:link>
                    </html:p>
                  </html:li>
                </html:ul>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="Merry updates ">Merry updates </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><![CDATA[It turns out writing a POSIX(ish) shell is hard; at least, there is a vast]]> number of slightly obscure features that one needs to support. I think this is  surprising because most people writing shell scripts write simple shell  scripts; scripts that use a much smaller subset of features. In the same  breath, those same developers are likely to use something like  <html:code>apt-get install bash</html:code><![CDATA[ which runs a plethora of more advanced (and non-POSIX) shell scripts!]]></html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:title text="Exec redirects ">Exec redirects </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>In a shell script, you can use the built-in command  <html:code>exec</html:code> to replace the current  <![CDATA[process with a new one (e.g.]]><html:code>exec vim</html:code><![CDATA[). However, there is a]]><fr:link href="https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_21" type="external"><html:em>different </html:em> mode of  operation </fr:link> for  <html:code>exec</html:code>: </html:p>
                    <html:blockquote>
                      <html:p>If exec is specified with no operands, any redirections associated with the  exec command shall be made in the current shell execution environment. </html:p>
                    </html:blockquote>
                    <html:p>One of my litmus tests for  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> is the  <fr:link href="https://wiki.debian.org/Debootstrap" type="external">Debian debootstrap  scripts </fr:link><![CDATA[ (h/t]]><fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil </fr:link><![CDATA[).]]> One thing that it does is the following: </html:p>
                    <html:pre class="hilite">
                      <html:code>
                        <html:span class="sh-entity-name-function">err</html:span>
                        <html:span class="sh-meta-function"> </html:span>
                        <html:span class="sh-punctuation-definition-arguments"><![CDATA[()]]></html:span>
                        <html:span class="sh-meta-function"> </html:span>
                        <html:span class="sh-punctuation-definition-group"><![CDATA[{]]></html:span>
                        <html:span class="sh-meta-scope-group">
</html:span>
                        <html:span class="sh-meta-scope-group">  </html:span>
                        <html:span class="sh-support-function-builtin">printf</html:span>
                        <html:span class="sh-meta-scope-group"> </html:span>
                        <html:span class="sh-punctuation-definition-string-begin">"</html:span>
                        <html:span class="sh-string-quoted-double">err </html:span>
                        <html:span class="sh-punctuation-definition-variable">$</html:span>
                        <html:span class="sh-variable-other-positional">1</html:span>
                        <html:span class="sh-punctuation-definition-string-end">"</html:span>
                        <html:span class="sh-meta-scope-group"> </html:span>
                        <html:span class="sh-keyword-operator-redirect">&gt;&amp;4</html:span>
                        <html:span class="sh-meta-scope-group">
</html:span>
                        <html:span class="sh-punctuation-definition-group"><![CDATA[}]]></html:span>
                        <html:span class="sh-punctuation-definition-function">
</html:span>
                        <html:span class="sh-source">
</html:span>
                        <html:span class="sh-support-function-builtin">exec</html:span>
                        <html:span class="sh-source"> </html:span>
                        <html:span class="sh-keyword-operator-redirect">4&gt;&amp;1</html:span>
                        <html:span class="sh-source"> 
</html:span>
                      </html:code>
                    </html:pre>
                    <html:p>A lot of detail has been elided for clarity.  <html:code>exec 4&gt;&amp;1</html:code> sets up a redirection  for the shell's execution environment in which file descriptor  <html:code>4</html:code> is now an  alias for standard output. So, writing to  <html:code>4</html:code><![CDATA[ (by redirecting a command's]]> standard output to  <html:code>4</html:code> i.e.  <html:code>&gt;&amp;4</html:code><![CDATA[) will output to where standard output is]]> <![CDATA[going (most likely the terminal).]]></html:p>
                    <html:p>For this to work, shell's must  <fr:link href="https://www.man7.org/linux/man-pages/man2/dup.2.html" type="external"><html:code>dup2</html:code></fr:link> the relevant file descriptors which have the following condition: </html:p>
                    <html:blockquote>
                      <html:p>If the file descriptor newfd was previously open, it is closed  <![CDATA[before being reused; the close is performed silently (i.e., any errors during]]> <![CDATA[the close are not reported by dup2()).]]></html:p>
                    </html:blockquote>
                    <html:p>This is all very well, unless your program has an important file already open  that happens to have file descriptor  <html:code>4</html:code>. The  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> Linux and POSIX  backends suffer from this problem. Both make use of a file-based  synchronisation mechanism for waking up the eventloop should another domain  push a completion to the scheduler's run queue. On Linux this is  <fr:link href="https://github.com/ocaml-multicore/eio/blob/c44ee5ce96c120b7ccc23a12d241dc8672e2888f/lib_eio_linux/sched.ml#L501" type="external">via an  eventfd </fr:link> and in  <fr:link href="https://github.com/ocaml-multicore/eio/blob/c44ee5ce96c120b7ccc23a12d241dc8672e2888f/lib_eio_posix/sched.ml#L20" type="external">POSIX, a  pipe </fr:link>. </html:p>
                    <html:p>This  <html:code>dup2</html:code> will close the  <html:code>eventfd</html:code><![CDATA[ and will likely grind Eio to a halt (or an]]> <html:code>assert false</html:code><![CDATA[). For now, I have resorted to vendoring]]><fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> and moving the  <html:code>eventfd</html:code> file descriptors to higher values, though I  <fr:link href="https://github.com/ocaml-multicore/eio/pull/836" type="external">have opened a PR to make this  more configurable </fr:link>. This bug is quite easy to write up...  it was not so easy to find! </html:p>
                    <html:p>As a random example, consider the  <html:code>debconf/confmodule</html:code> <fr:link href="https://sources.debian.org/src/debconf/1.5.77/confmodule/" type="external">script </fr:link> which  offers very little room for a buggy implementation! </html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="Outreachy ">Outreachy </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>The presentations from the demonstrations for this round of Outreachy are now online! </html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:uri>https://patrick.sirref.org/outreachy-ocaml-tiff/</fr:uri>
                    <fr:display-uri>outreachy-ocaml-tiff</fr:display-uri>
                    <fr:route>/outreachy-ocaml-tiff/</fr:route>
                    <fr:title text="Write support in OCaml TIFF library">Write support in OCaml TIFF library</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I am mentoring  <fr:link href="/tambe-salome/" title="Tambe Salome" uri="https://patrick.sirref.org/tambe-salome/" display-uri="tambe-salome" type="local">Tambe Salome </fr:link> during the December 2025 Outreachy  round to add support for writing TIFF files in the  <fr:link href="/ocaml-tiff/" title="ocaml-tiff" uri="https://patrick.sirref.org/ocaml-tiff/" display-uri="ocaml-tiff" type="local">ocaml-tiff </fr:link> library. </html:p>
                    <html:p>You can now see the video of the demonstration day presentation: </html:p>
                    <html:div style="text-align: center">
<html:iframe title="Outreachy Demo Day December 2025 Round" width="560" height="315" src="https://watch.ocaml.org/videos/embed/8aUqMhFvhQGq4WJLH3ukjA?start=1h18m33s" frameborder="0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups allow-forms" />
</html:div>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>3</fr:month>
              <fr:day>19</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/weekly-2026-w12/</fr:uri>
            <fr:display-uri>weekly-2026-w12</fr:display-uri>
            <fr:route>/weekly-2026-w12/</fr:route>
            <fr:title text="A POSIX Shell in OCaml">A POSIX Shell in OCaml</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Long time, no weekly. Since the start of this year I have been building a POSIX  shell in OCaml called  <html:code>msh</html:code><![CDATA[ (with the underlying library called]]><html:code>Merry</html:code><![CDATA[).]]> <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> is available online now. </html:p>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>19</fr:day>
                </fr:date>
                <fr:title text="A POSIX(ish) shell in OCaml"><![CDATA[A POSIX(ish) shell in OCaml]]></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link><![CDATA[ is a POSIX(ish) in OCaml. It uses]]><fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> alongside  <fr:link href="github.com/colis-anr/morbig" type="external">Morbig </fr:link><![CDATA[ (a static parser for POSIX shell).]]></html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>19</fr:day>
                    </fr:date>
                    <fr:title text="Why another (POSIX) shell?"><![CDATA[Why another (POSIX) shell?]]></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Shells have been around for a long time. In my research on the notion of  <html:em>metashell </html:em> I wrote about Louis Pouzin originally coining the term: </html:p>
                    <fr:tree show-metadata="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>5</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/pouzin-shell/</fr:uri>
                        <fr:display-uri>pouzin-shell</fr:display-uri>
                        <fr:route>/pouzin-shell/</fr:route>
                        <fr:title text="Metashells › Louis Pouzin's &quot;SHELL&quot;  "><fr:link href="/weekly-2025-05-12/" title="Metashells" uri="https://patrick.sirref.org/weekly-2025-05-12/" display-uri="weekly-2025-05-12" type="local">Metashells</fr:link> › Louis Pouzin's "SHELL"  </fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>I spent some time reading  <fr:link href="/pouzin-shell-2013/" title="The Origin of the Shell" uri="https://patrick.sirref.org/pouzin-shell-2013/" display-uri="pouzin-shell-2013" type="local">part of the multics design documentation </fr:link> this week. Louis Pouzin  coined the term "SHELL" in this document, and I was reminded yet again just how important it is to be a good writer  even as a "computer science researcher". For example, this excerpt from the requirements section of the document </html:p>
                        <html:blockquote>
                          <html:p>The previous definitions imply that a command MUST be designed while keeping  in mind the user, sitting at his console, wondering about what might be going  on, mistyping or forgetting arguments, even if fully aware of the  conventions, and possibly interfering with the command by hasty quits,  carriage returns, and other temperamental reactions. </html:p>
                        </html:blockquote>
                        <html:p>And then later, when defining the "SHELL". </html:p>
                        <html:blockquote>
                          <html:p>We may envision a common procedure called automatically by the supervisor  whenever a user types in some message at his console, at a time when he has  <![CDATA[no other process in active execution under console control (presently called]]> <![CDATA[command level). This procedure acts as an interface between console messages]]> and subroutine. The purpose of such a procedure is to create a medium of  exchange into which one could activate any procedure,  <html:em>inside of another program  if it were called </html:em>. Hereafter, for simplification, we shall refer to  that procedure as the "SHELL". </html:p>
                        </html:blockquote>
                        <html:p>It still surprises how little the undergraduate degree in computer science at  <fr:link href="/ucam/" title="University of Cambridge" uri="https://patrick.sirref.org/ucam/" display-uri="ucam" type="local">Cambridge </fr:link> focuses on writing skills. </html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:p>I built  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> exploring the idea of a shell-like interface that allowed  users to  <html:em>undo </html:em><![CDATA[ their shell actions (amongst other cool tricks). Unfortunately]]> <html:em>shell-like </html:em> is not enough.  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> cut many corners to masquerade as a  <![CDATA[shell (e.g. appending]]><html:code>env</html:code> to understand how a command may have altered the  <![CDATA[execution environment). I felt it was necessary to make]]><fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> a "SHELL"!  To do that, I needed a solid foundation to build on. </html:p>
                    <html:p><html:code>msh</html:code>, the POSIX shell that comes with  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link>, is by no means POSIX-complete  in terms of features. But it is my  <fr:link href="https://github.com/patricoferris/nixos/blob/e0faf870f76710d4a75ace775f333c88f1321c5a/modules/default.nix#L59" type="external">daily driver at this  point </fr:link>.  It includes a pure OCaml rewrite of  <fr:link href="github.com/antirez/linenoise" type="external">linenoise </fr:link> <![CDATA[(a small, self-contained alternative to the venerable]]><html:code>readline</html:code><![CDATA[) called]]> <fr:link href="https://tangled.org/patrick.sirref.org/bruit" type="external">bruit </fr:link>. </html:p>
                    <html:p>If you have  <html:code>docker</html:code> installed on your machine, you can take it for a spin today: </html:p>
                    <html:pre><![CDATA[docker run -it --rm patrickferris/msh]]></html:pre>
                    <html:p>The  <html:code>patrickferris/msh</html:code> docker image is just for trying it out. It is based on  the OCaml 5.3 alpine image. </html:p>
                    <html:p>Alternatively, you can build  <html:code>msh</html:code> from source and have it available in your  opam switch. </html:p>
                    <html:pre><![CDATA[opam pin git+https://tangled.org/patrick.sirref.org/merry]]></html:pre>
                    <html:p>There are many small paper cuts left to patch over, but most of it is porcelain  <![CDATA[(e.g.]]><html:code>ctrl+left-arrow</html:code> for moving in  <fr:link href="https://tangled.org/patrick.sirref.org/bruit" type="external">bruit </fr:link><![CDATA[). Unfortunately, these are the kinds]]> of things that you will  <html:em>immediately </html:em> stumble upon. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>19</fr:day>
                    </fr:date>
                    <fr:title text="What makes Merry different? ">What makes Merry different? </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Nothing. </html:p>
                    <html:p><fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> is supposed to be a solid, POSIX-ish base to build on.  Unfortunaltely, as it turns out, the subset of features from the POSIX  specification that people  <html:em>actually use </html:em>... is pretty much all of it. Every  possible redirection, variable expansion, shell built-in and compound command  make some appearance. Not to mention the non-POSIX bits of shell we all take for  <![CDATA[granted (e.g.]]><html:code>&amp;&gt;</html:code><![CDATA[-redirection).]]></html:p>
                    <html:p><fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> and  <html:code>msh</html:code> are useable. You will most likely find bugs if you use  them. If, when using  <html:code>msh</html:code>, you find something obscure happening you can enable  debug mode either my setting the variable  <html:code>MSH_DEBUG</html:code> or by invoking  <html:code>msh</html:code> with  <html:code>-v -v</html:code>. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>19</fr:day>
                    </fr:date>
                    <fr:title text="What's next? ">What's next? </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>It is soon time to combine  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> and  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> into the time-travelling,  POSIX-ish shell that I have been trying to build since I first started working  on  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link>. </html:p>
                    <html:p>For this to be successful, I need  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link> to be able to pass plenty of tests  and right now that involves trying to install plenty of packages using tools  like  <html:code>apk</html:code> and  <html:code>apt</html:code>. </html:p>
                    <fr:tree show-metadata="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:title text="Shell MRDT ">Shell MRDT </fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>What I am particularly interested in reasoning about, is the  <fr:link href="https://tangled.org/patrick.sirref.org/merry/blob/main/src/lib/eval.ml#L22" type="external">execution  context </fr:link> in  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link>. This value, alongside the file-system, constitutes a fairly deep  understanding of the state that changes in each step of a shell's evaluation  loop. </html:p>
                        <html:p>This was, in terms of  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link>, the missing piece for truly building some kind of  <fr:link href="/mrdts/" title="Mergeable Replicated Data Type Implementation" uri="https://patrick.sirref.org/mrdts/" display-uri="mrdts" type="local">MRDT </fr:link> across shell sessions. </html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>19</fr:day>
                </fr:date>
                <fr:title text="TIFF in OCaml ">TIFF in OCaml </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I picked up from the excellent  <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy </fr:link> work of  <fr:link href="https://patrick.sirref.org/tambe salome/" type="external">Tambe Salome </fr:link> in  getting write-support in  <fr:link href="/ocaml-tiff/" title="ocaml-tiff" uri="https://patrick.sirref.org/ocaml-tiff/" display-uri="ocaml-tiff" type="local">ocaml-tiff </fr:link>. We are getting closer to the kind of API  I envisaged in this latest round of refinement and review. </html:p>
                <html:pre class="hilite">
                  <html:code>
                    <html:span class="ocaml-keyword-other">let</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">/</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Eio</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Path</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">/</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-keyword">let</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-entity-name-function-binding">checkerboard</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">~</html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-keyword">let</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-entity-name-function-binding">v</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Nx</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">zeros</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Nx</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">uint8</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[[|]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[|]]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">in</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-keyword">for</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-entity-name-function-binding">row</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">0</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">to</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">-</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">1</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">do</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">    </html:span>
                    <html:span class="ocaml-keyword">for</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-entity-name-function-binding">col</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">0</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">to</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">-</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">1</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">do</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">      </html:span>
                    <html:span class="ocaml-keyword-other">if</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source">row</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">+</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">col</html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">mod</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">2</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">0</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">then</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Nx</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">set_item</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[[]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">row</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">col</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[]]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">254</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">v</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">    </html:span>
                    <html:span class="ocaml-keyword-other">done</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-keyword-other">done</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-separator-terminator punctuation-separator">;</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Nx</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">to_bigarray</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">v</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-keyword-other">let</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-unit"><![CDATA[()]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Eio_posix</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">run</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">@@</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">fun</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">env</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">-&gt;</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Tiff_eio</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">with_open_out</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source">env</html:span>
                    <html:span class="ocaml-keyword-other">#</html:span>
                    <html:span class="ocaml-source">cwd</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">/</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-string-quoted-double">"</html:span>
                    <html:span class="ocaml-string-quoted-double">example.tiff</html:span>
                    <html:span class="ocaml-string-quoted-double">"</html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">@@</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">fun</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">w</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">-&gt;</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-keyword">let</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-entity-name-function-binding">tif</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-operator">=</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Tiff</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">make</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source">checkerboard</html:span>
                    <html:span class="ocaml-source"> ~</html:span>
                    <html:span class="ocaml-source">size</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                    <html:span class="ocaml-constant-numeric-decimal-integer">256</html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other">in</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-source">  </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Tiff</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">to_file</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">tif</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">w</html:span>
                    <html:span class="ocaml-source">
</html:span>
                  </html:code>
                </html:pre>
                <html:img src="/bafkrmiaqqczj5lemda5ijfjtjsyldbhmveu3btfvoa7rpt5k4dvdejjuhu.png" />
                <html:p>I have also been extremely pleased to see further external collaborators appearing: </html:p>
                <html:ul>
                  <html:li>
                    <html:p><fr:link href="https://github.com/geocaml/ocaml-tiff/pull/63" type="external">Nicolas </fr:link> helping out with metadata maintainence. </html:p>
                  </html:li>
                  <html:li>
                    <html:p><fr:link href="https://github.com/geocaml/ocaml-tiff/pull/62" type="external">Virgile </fr:link> adding support for reading multi-image TIFF files. </html:p>
                  </html:li>
                </html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>9</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/fellowship-roundup/</fr:uri>
            <fr:display-uri>fellowship-roundup</fr:display-uri>
            <fr:route>/fellowship-roundup/</fr:route>
            <fr:title text="Fellowship Roundup">Fellowship Roundup</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>9</fr:day>
                </fr:date>
                <fr:title text="Overview ">Overview </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>February is the final month of my current six-month fellowship work with  <fr:link href="https://tarides.com/" type="external">Tarides </fr:link>. A lot of the work can be summarised by reading  the  <fr:link href="/ocaml-blog/" title="Patrick's OCaml Blog" uri="https://patrick.sirref.org/ocaml-blog/" display-uri="ocaml-blog" type="local">roundups </fr:link><![CDATA[ (see]]><fr:link href="/ocaml-roundup-october-2025/" title="OCaml Roundup: October 2025" uri="https://patrick.sirref.org/ocaml-roundup-october-2025/" display-uri="ocaml-roundup-october-2025" type="local">October </fr:link>,  <fr:link href="/ocaml-roundup-november-2025/" title="OCaml Roundup: November 2025" uri="https://patrick.sirref.org/ocaml-roundup-november-2025/" display-uri="ocaml-roundup-november-2025" type="local">November </fr:link>,  <fr:link href="/ocaml-roundup-december-2025/" title="OCaml Roundup: December 2025" uri="https://patrick.sirref.org/ocaml-roundup-december-2025/" display-uri="ocaml-roundup-december-2025" type="local">December </fr:link> and  <fr:link href="/ocaml-roundup-january-2026/" title="OCaml Roundup: January 2026" uri="https://patrick.sirref.org/ocaml-roundup-january-2026/" display-uri="ocaml-roundup-january-2026" type="local">January </fr:link><![CDATA[). I have been writing throughout the fellowship.]]> However, they do not quite capture all the work I have been doing. </html:p>
                <html:p>Below, I pick individual projects and expand on them more holistically rather  than pointing at individual PRs or issues. </html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Ppxlib ">Ppxlib </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Most of my time over the past six months has been devoted to  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link> maintenance. A large proportion of this time has been solo development work.  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib </fr:link><![CDATA[ is a cornerstone library of the OCaml ecosystem (whether people like]]> <![CDATA[it or not).]]></html:p>
                    <html:pre><![CDATA[$ opam list --depends-on=ppxlib --recursive | wc -l
2030]]></html:pre>
                    <html:p>Moreover, it is completely invaluable to Jane Street too. Like other AST-based  <![CDATA[tools (e.g. ocamlformat, merlin),]]><fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link> must follow a regular release  schedule to support newer compilers. During the years of multicore OCaml development,  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link> maintenance was a little easier as the Parsetree rarely changed. However,  since then, the same cannot be said. Since OCaml 5.2, here are just some of the Parsetree  changes: </html:p>
                    <html:ul>
                      <html:li>
                        <html:p>Functions are represented according to their arity. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Local module opens on types. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Effect syntax. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Modular explicits. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>External types. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Locations for all parts of long identifiers. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Labeled tuples. </html:p>
                      </html:li>
                    </html:ul>
                    <html:p>In a perfect world, each of these require a codec for serialising the feature  into ASTs that do not support the feature, plenty of tests and new  <html:code>Ast_builder</html:code>/ <html:code>Ast_pattern</html:code> functions for using the feature.  <fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan </fr:link> and I have been managing pretty well I would say, though we  are not getting any technical debt work done. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Outreachy ">Outreachy </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>As the OCaml coordinator for  <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy </fr:link> I have been running the latest December 2025 round.  We are lucky to have  <html:em>four </html:em> projects on the go! </html:p>
                    <html:ul>
                      <html:li>
                        <html:p>Thibaut Mattio is mentoring two projects:  <fr:link href="https://www.outreachy.org/outreachy-december-2025-internship-cohort/communities/ocaml/#raven-create-a-monitoring-dashboard-for-deep-learn" type="external">an ML dashboard for Raven </fr:link> and  <fr:link href="https://www.outreachy.org/outreachy-december-2025-internship-cohort/communities/ocaml/#create-an-oxcaml-backend-for-raven" type="external">an OxCaml backend for Raven </fr:link>. </html:p>
                      </html:li>
                      <html:li>
                        <html:p><fr:link href="https://github.com/xvw" type="external">Xvw </fr:link> is mentoring a  <fr:link href="https://github.com/yocaml/" type="external">Yocaml </fr:link>  <fr:link href="https://www.outreachy.org/outreachy-december-2025-internship-cohort/communities/ocaml/#improve-yocaml-error-reporting-and-data-model" type="external">project </fr:link>. </html:p>
                      </html:li>
                      <html:li>
                        <html:p>I am  <fr:link href="/outreachy-ocaml-tiff/" title="Write support in OCaml TIFF library" uri="https://patrick.sirref.org/outreachy-ocaml-tiff/" display-uri="outreachy-ocaml-tiff" type="local">mentoring </fr:link> a  <fr:link href="/geocaml/" title="Geocaml" uri="https://patrick.sirref.org/geocaml/" display-uri="geocaml" type="local">Geocaml </fr:link> project. </html:p>
                      </html:li>
                    </html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Eio ">Eio </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>During my work on tools like  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> I have made a few improvements to  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> including: </html:p>
                    <html:ul>
                      <html:li>
                        <html:p><fr:link href="https://github.com/ocaml-multicore/eio/pull/821" type="external">A draft PR for incremental reading of directories </fr:link>. </html:p>
                      </html:li>
                      <html:li>
                        <html:p><fr:link href="https://github.com/ocaml-multicore/eio/pull/803" type="external">New fork actions for processes: setgid, setuid and process groups </fr:link>. </html:p>
                      </html:li>
                      <html:li>
                        <html:p><fr:link href="https://github.com/ocaml-multicore/eio/pull/823" type="external">Utility functions for overriding standard environments </fr:link>. </html:p>
                      </html:li>
                      <html:li>
                        <html:p><fr:link href="https://github.com/ocaml-multicore/eio/pull/822" type="external">Fixing documentation </fr:link>. </html:p>
                      </html:li>
                    </html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="OxCaml ">OxCaml </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I have enjoyed my work on OxCaml went it has happend. I think a few tools have  been useful including the  <fr:link href="/try-oxcaml/" title="Try OxCaml" uri="https://patrick.sirref.org/try-oxcaml/" display-uri="try-oxcaml" type="local">try-oxcaml </fr:link> work.  <fr:link href="/dra27/" title="David Allsopp" uri="https://patrick.sirref.org/dra27/" display-uri="dra27" type="local">David </fr:link> and I also  had fun at  <fr:link href="/icfp-2025/" title="ICFP 2025" uri="https://patrick.sirref.org/icfp-2025/" display-uri="icfp-2025" type="local">ICFP </fr:link> discussing some quick experiments related to  <fr:link href="/icfp-oxcaml-uring/" title="OCaml Roundup: October 2025 › OxCaml Experiments  " uri="https://patrick.sirref.org/icfp-oxcaml-uring/" display-uri="icfp-oxcaml-uring" type="local">io_uring  and OxCaml </fr:link>. </html:p>
                    <html:p>One road-blocker here is the comparative amount of time spent trying to keep  the OxCaml ecosystem working. Given my limited time working on fellowship  <![CDATA[projects, the rate of change of OxCaml (including the opam ecosystem) meant]]> most of the time was spent making it just work, not exploring or experimenting  with the features themselves. I think this has got better in recent months  and perhaps jumping back in I would be surprised at the progress that has been  made there. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Forester ">Forester </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="https://tarides.org/" type="external">Tarides </fr:link> are funding some work on  <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">forester </fr:link>. This site  uses  <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">forester </fr:link> by way of  <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft </fr:link> and I have spent some time working on  these tools during the fellowship. </html:p>
                    <html:p>This includes a  <html:code>bytesrw</html:code>-based  <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">bibtex </fr:link> library in OCaml that could be  released soon. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Papers ">Papers </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I had the great fortune of attending  <fr:link href="https://patrick.sirref.org/ifcp-2025/" type="external">ICFP </fr:link> where I presented two  talks and was co-author on a few others too. </html:p>
                    <html:hr />
                    <fr:tree show-metadata="false" expanded="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/David J. Scott" type="external">David J. Scott</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Ryan T. Gibb" type="external">Ryan T. Gibb</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Thomas Gazagnaire/" type="external">Thomas Gazagnaire</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/madhavapeddy2025docker/</fr:uri>
                        <fr:display-uri>madhavapeddy2025docker</fr:display-uri>
                        <fr:route>/madhavapeddy2025docker/</fr:route>
                        <fr:title text="Functional Networking for Millions of Docker Desktops (Experience Report)">Functional Networking for Millions of Docker Desktops (Experience Report)</fr:title>
                        <fr:taxon>Reference</fr:taxon>
                        <fr:meta name="external">https://dl.acm.org/doi/10.1145/3747525</fr:meta>
                        <fr:meta name="journal">Proc. ACM Program. Lang.</fr:meta>
                        <fr:meta name="doi">10.1145/3747525</fr:meta>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/David J. Scott" type="external">David J. Scott</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Ryan T. Gibb" type="external">Ryan T. Gibb</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Thomas Gazagnaire/" type="external">Thomas Gazagnaire</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                            </fr:date>
                            <fr:title text="Abstract ">Abstract </fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>
	Docker is a developer tool used by millions of developers to build, share
	and run software stacks. The Docker Desktop clients for Mac and Windows
	have long used a novel combination of virtualisation and OCaml unikernels
	to seamlessly run Linux containers on these non-Linux hosts.

	We reflect on a decade of shipping this functional OCaml code into
	production across hundreds of millions of developer desktops, and discuss
	the lessons learnt from our experiences in integrating OCaml deeply into
	the container architecture that now drives much of the global cloud. We
	conclude by observing just how good a fit for systems programming that the
	unikernel approach has been, particularly when combined with the OCaml
	module and type system.
 </html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/ferris2025scientific_programming/</fr:uri>
                        <fr:display-uri>ferris2025scientific_programming</fr:display-uri>
                        <fr:route>/ferris2025scientific_programming/</fr:route>
                        <fr:title text="What we talk about when we talk about scientific programming">What we talk about when we talk about scientific programming</fr:title>
                        <fr:taxon>Reference</fr:taxon>
                        <fr:meta name="external">https://watch.eeg.cl.cam.ac.uk/w/aYXqXLtgQawYMjVXjSQtjx</fr:meta>
                        <fr:meta name="doi" />
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                            </fr:date>
                            <fr:title text="Abstract ">Abstract </fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><![CDATA[	Programming for the planet undoubtedly involves programming
	scientifically, but what kind of programming are we talking about
	and what makes it scientific? In what ways does it differ from
	other forms of programming, if at all? Is scientific programming,
	data science or machine learning fundamentally different to
	constructing a compiler or building a high-throughput web server?
	By considering how the scientific method (with its falsifiable
	hypotheses and repeatable and reproducible experiments) relates to
	scientific programming, I hope to explore how computer science and
	traditional programming techniques are coming up short in meeting
	the requirements of scientific programmers.]]></html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/ferris2025hazel_of_ocaml/</fr:uri>
                        <fr:display-uri>ferris2025hazel_of_ocaml</fr:display-uri>
                        <fr:route>/ferris2025hazel_of_ocaml/</fr:route>
                        <fr:title text="Generating a corpus of Hazel programs from ill-typed OCaml programs">Generating a corpus of Hazel programs from ill-typed OCaml programs</fr:title>
                        <fr:taxon>Reference</fr:taxon>
                        <fr:meta name="external">https://patrick.sirref.org/var/tyde2025.pdf</fr:meta>
                        <fr:meta name="doi" />
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                            </fr:date>
                            <fr:title text="Abstract ">Abstract </fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>
		When developing a new programming language, having a large corpus of
		both correct and incorrect programs allows language designers to test
		and explore the capabilities of their new language. However,
		bootstrapping such a corpus of incorrect programs is time-consuming and
		arduous. We therefore explore how to reuse code from more mature
		languages to generate a corpus of ill-typed code for newer ones. We
		have developed a compiler to Hazel, an emerging language with typed
		holes, from the more mature OCaml ecosystem. We find it practical to
		generate a comprehensive corpus of ill-typed programs for Hazel
		development, and discuss future larger scale efforts towards bridging
		ecosystems.
 </html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:p>See also <fr:link href="https://patricoferris.github.io/hazel_of_ocaml/" type="external">the online hazel of ocaml compiler</fr:link></html:p>
                    <fr:tree show-metadata="false" expanded="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Max Carroll/" type="external">Max Carroll</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/carroll2025decomposable_type_highlighting/</fr:uri>
                        <fr:display-uri>carroll2025decomposable_type_highlighting</fr:display-uri>
                        <fr:route>/carroll2025decomposable_type_highlighting/</fr:route>
                        <fr:title text="Decomposable Type Highlighting for Bidirectional Type and Cast Systems">Decomposable Type Highlighting for Bidirectional Type and Cast Systems</fr:title>
                        <fr:taxon>Reference</fr:taxon>
                        <fr:meta name="external">https://maxcarroll0.github.io/papers/workshops/HATRA-decomposable-type-highlighting/</fr:meta>
                        <fr:meta name="doi" />
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Max Carroll/" type="external">Max Carroll</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                            </fr:date>
                            <fr:title text="Abstract ">Abstract </fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>
		 We explore how to provide programmers with an interactive
		 interface for explaining the process by which static types and
		 dynamic casts are derived, with the goal of improving the
		 debugging of static and dynamic type errors. To this end, we
		 define mathematical foundations for a decomposable highlighting
		 system within a bidirectional system, and show how these can be
		 propagated through dynamic types in a cast system. Our prototype
		 implementation in the gradually typed Hazel language includes a
		 web-based user interface, through which we highlight the
		 importance of type level debugging.
 </html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Michael Winston Dales/" type="external">Michael Winston Dales</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Alison Eyres/" type="external">Alison Eyres</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Francesca A. Ridley" type="external">Francesca A. Ridley</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Simon Tarr/" type="external">Simon Tarr</fr:link>
                          </fr:author>
                          <fr:author>
                            <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                        </fr:date>
                        <fr:uri>https://patrick.sirref.org/dales2025yirgacheffe/</fr:uri>
                        <fr:display-uri>dales2025yirgacheffe</fr:display-uri>
                        <fr:route>/dales2025yirgacheffe/</fr:route>
                        <fr:title text="Yirgacheffe: A Declarative Approach to Geospatial Data">Yirgacheffe: A Declarative Approach to Geospatial Data</fr:title>
                        <fr:taxon>Reference</fr:taxon>
                        <fr:meta name="external">https://dl.acm.org/doi/10.1145/3759536.3763806</fr:meta>
                        <fr:meta name="doi">10.1145/3759536.3763806</fr:meta>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Michael Winston Dales/" type="external">Michael Winston Dales</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Alison Eyres/" type="external">Alison Eyres</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Francesca A. Ridley" type="external">Francesca A. Ridley</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Simon Tarr/" type="external">Simon Tarr</fr:link>
                              </fr:author>
                              <fr:author>
                                <fr:link href="https://patrick.sirref.org/Anil Madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                            </fr:date>
                            <fr:title text="Abstract ">Abstract </fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><![CDATA[		We present Yirgacheffe, a declarative geospatial library that
		allows spatial algorithms to be implemented concisely, supports
		parallel execution, and avoids common errors by automatically
		handling data (large geospatial rasters) and resources (cores,
		memory, GPUs). Our primary user domain comprises ecologists,
		where a typical problem involves cleaning messy occurrence data,
		overlaying it over tiled rasters, combining layers, and deriving
		actionable insights from the results. We describe the successes
		of this approach towards driving key pipelines related to global
		biodiversity and describe the capability gaps that remain, hoping
		to motivate more research into geospatial domain-specific
		languages.]]></html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:hr />
                    <html:p>I had some great conversations with  <fr:link href="/kc/" title="KC Sivaramakrishnan" uri="https://patrick.sirref.org/kc/" display-uri="kc" type="local">KC </fr:link> too with respect to my current research. </html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>9</fr:day>
                </fr:date>
                <fr:title text="Future Work ">Future Work </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>As I enter my final year of the PhD, my goal would be to try and align more of  my fellowship work with my own research wherever it makes sense. This research  focuses on the following hypothesis: </html:p>
                <html:blockquote>
                  <html:p>Embedding deep provenance tracking, reversible execution and mergeable  <![CDATA[histories directly into an interactive programming environment (a POSIX-like]]> <![CDATA[shell) greatly decreases the gap between exploratory scientific work and]]> reproducible, publishable results; all whilst leaving existing workflows  intact and being programming language agnostic. </html:p>
                </html:blockquote>
                <html:p>I want to focus on building these tools using  <fr:link href="/irmin/" title="Irmin" uri="https://patrick.sirref.org/irmin/" display-uri="irmin" type="local">Irmin </fr:link>,  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link>,  <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml </fr:link> etc. There are other projects I wish to continue regardless, like  <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy </fr:link><![CDATA[, though just as a coordinator (not a mentor).]]></html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Overlapping PhD Work ">Overlapping PhD Work </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>There are multiple projects that overlap with my work. For example,  <fr:link href="/irmin/" title="Irmin" uri="https://patrick.sirref.org/irmin/" display-uri="irmin" type="local">Irmin </fr:link>,  which I wrote a  <fr:link href="/irmin-retro/" title="Irmin Retrospective" uri="https://patrick.sirref.org/irmin-retro/" display-uri="irmin-retro" type="local">retrospective </fr:link> for. This is at the core of  <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter </fr:link> and suggests an extremely valid use case for a brancheable,  mergeable database. </html:p>
                    <html:p>In addition to this, continuing to work on  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> makes sense to me too.  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> currently has no maintainer and no active development, but the  <fr:link href="https://github.com/ocaml-multicore/eio/issues" type="external">issues  are piling up </fr:link>. In particular, I  am making heavy use of  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> in  <fr:link href="/merry/" title="Merry" uri="https://patrick.sirref.org/merry/" display-uri="merry" type="local">Merry </fr:link><![CDATA[, a POSIX(ish) shell written in]]> OCaml. Aside from research angles on brancheable and mergeable shells, I am  also quite interested in how this might look in terms of OxCaml. I met with  <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil </fr:link> and  <fr:link href="/talex5/" title="Thomas Leonard" uri="https://patrick.sirref.org/talex5/" display-uri="talex5" type="local">Thomas </fr:link> recently to discuss the future of  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> and there was some agreement that we are all heavy users of it and hope  to keep up its maintenance and set of features. </html:p>
                    <html:p>One large piece of work that is sorely needed here is moving  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link> to  <html:code>bytes</html:code> and not bigarray-backed  <html:code>Cstruct</html:code>s. Any libraries using  <html:code>bytesrw</html:code><![CDATA[ (e.g.]]> <html:code>jsont</html:code><![CDATA[) incur an extra copy of data into and out of the bytes.]]> <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil </fr:link> has been  <fr:link href="https://anil.recoil.org/notes/oxcaml-httpz" type="external">working on some of the  pieces </fr:link> recently to make this  better! </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Maintaining and Releasing my own libraries ">Maintaining and Releasing my own libraries </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I have published quite a few OCaml libraries in my time, below is just a few  <![CDATA[libraries (filtered to not include OCurrent projects).]]></html:p>
                    <html:pre><![CDATA[$ opam list --all --no-switch --columns=name,authors: | grep -E "sirref|Ferris" | cut -d " " -f1
carbon
geojson
geojsone
graft
hilite
ISO3166
jekyll-format
ppx_deriving_ezjsonm
ppx_deriving_yaml
rtree
search
topojson
topojsone
cid
multibase
multicodec
multihash
multihash-digestif]]></html:pre>
                    <html:p>Some of these are used in the community including  <html:code>hilite</html:code>,  <html:code>ppx_deriving_yaml</html:code> and the multi-codecs. I would like to do some general maintenance of some of  these tools and release a few iterations of  <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft </fr:link> which now makes use of  <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">bib </fr:link>. </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Ppxlib Maintenance ">Ppxlib Maintenance </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>By far, maintenance of  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link> takes up a majority of my time. I think,  given the other work I need to focus on, it would be great to try to minimise  the amount of time working on  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link>. In particular, perhaps only  maintaining  <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib </fr:link> as far as OCaml release-readiness is a possibility and  <![CDATA[important bug fixes (like]]><fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/613" type="external">the OOM bug reported by  Jane Street </fr:link><![CDATA[).]]></html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="https://patrick.sirref.org/Patrick Ferris/" type="external">Patrick Ferris</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Forester, Graft and Writing ">Forester, Graft and Writing </fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>With all of this work, I am eager to communicate what I am up to and my  thoughts on open source, OCaml, OxCaml etc. I am glad to be using  <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester </fr:link> <![CDATA[to do this, particularly as it is written in OCaml (and could make great use of]]> my own work on  <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio </fr:link><![CDATA[).]]></html:p>
                    <html:p>I hope to continue working on  <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft </fr:link> and related tools like  <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">bib </fr:link>. But I  would also like to start writing some long-form content similar to the  <fr:link href="/irmin-retro/" title="Irmin Retrospective" uri="https://patrick.sirref.org/irmin-retro/" display-uri="irmin-retro" type="local">Irmin  retrospective </fr:link>. </html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Related">Related</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:uri>https://patrick.sirref.org/eio/</fr:uri>
            <fr:display-uri>eio</fr:display-uri>
            <fr:route>/eio/</fr:route>
            <fr:title text="Eio">Eio</fr:title>
            <fr:meta name="external">https://github.com/ocaml-multicore/eio</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:blockquote>
              <html:p>Eio provides an effects-based direct-style IO stack for OCaml 5 </html:p>
            </html:blockquote>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Contributions">Contributions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
  </fr:backmatter>
</fr:tree>
