<?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>2025</fr:year>
      <fr:month>6</fr:month>
      <fr:day>2</fr:day>
    </fr:date>
    <fr:uri>https://patrick.sirref.org/graft/</fr:uri>
    <fr:display-uri>graft</fr:display-uri>
    <fr:route>/graft/</fr:route>
    <fr:title text="Graft">Graft</fr:title>
    <fr:meta name="external">https://github.com/patricoferris/graft</fr:meta>
  </fr:frontmatter>
  <fr:mainmatter>
    <html:p>Graft is a <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> preprocessor.</html:p>
    <html:p>It takes a forester (a directory of trees) written in a mixture of Markdown, Bibtex and <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax and produces a new forest completely written in <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax.</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>6</fr:month>
          <fr:day>2</fr:day>
        </fr:date>
        <fr:title text="Usage">Usage</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p><html:code>graft</html:code> simply preprocesses a forest generating Forester trees from <html:code>.md</html:code>, <html:code>.bib</html:code> and <html:code>.tree</html:code> files. It will copy the structure of the input directory in the output directory.</html:p>
        <html:pre class="hilite">
          <html:code>
            <html:span class="sh-source">$ graft preprocess --output=grafted-trees trees
</html:span>
            <html:span class="sh-source">$ forester build
</html:span>
          </html:code>
        </html:pre>
        <html:p>This assumes that you have updated your Forester <html:code>toml</html:code> file to put the <html:code>grafted-trees</html:code> directory as your source of trees.</html:p>
        <html:pre><![CDATA[[forest]
trees = [ "grafted-trees" ]]]></html:pre>
      </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>2025</fr:year>
          <fr:month>6</fr:month>
          <fr:day>2</fr:day>
        </fr:date>
        <fr:title text="Example">Example</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p>A typical "tree" might look something like</html:p>
        <html:pre><![CDATA[---
title: Opentrace and Supervisions
date: 2025-05-26
author: Patrick Ferris
---

Over the past two weeks I have mainly split my time (amongst many things) developing [opentrace](open-trace)
and doing revision supervisions.

```forester
\put\transclude/numbered{false}
\transclude{open-trace}
```]]></html:pre>
        <html:p>A few things to note:</html:p>
        <html:ol>
          <html:li>
            <html:p>The <html:code>yaml</html:code> frontmatter allows you to add some of the metadata fields from Forester.</html:p>
          </html:li>
          <html:li>
            <html:p>At any point in your markdown there is an escape hatch to Forester using a <html:code>forester</html:code> codeblock.</html:p>
          </html:li>
        </html:ol>
      </fr:mainmatter>
    </fr:tree>
  </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 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>2025</fr:year>
              <fr:month>6</fr:month>
              <fr:day>2</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/weekly-2025-06-02/</fr:uri>
            <fr:display-uri>weekly-2025-06-02</fr:display-uri>
            <fr:route>/weekly-2025-06-02/</fr:route>
            <fr:title text="Forester as a Target Syntax">Forester as a Target Syntax</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>This week included some time finishing <fr:link href="/open-trace/" title="Opentrace" uri="https://patrick.sirref.org/open-trace/" display-uri="open-trace" type="local">opentrace</fr:link> and subsequently folding it into <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shelter</fr:link>. I have been writing up some more of the draft paper for <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shelter</fr:link> which I am excited to share in the near future.</html:p>
            <html:p>I revisited the <fr:link href="/vpnkit-upgrade/" title="Defunctorising VPNKit" uri="https://patrick.sirref.org/vpnkit-upgrade/" display-uri="vpnkit-upgrade" type="local">upgrading vpnkit</fr:link> PR and pushed some more fixes. I have been thinking, again, about the promise of a direct-style world for OCaml that just hasn't quite landed yet. <html:em>C'est la vie</html:em>.</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>6</fr:month>
                  <fr:day>2</fr:day>
                </fr:date>
                <fr:title text="Forester and Graft">Forester and Graft</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I spent a bit of time finally pulling out my changes to <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> to add markdown and bibtex support into a standalone tool: <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</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>2025</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:uri>https://patrick.sirref.org/graft/</fr:uri>
                    <fr:display-uri>graft</fr:display-uri>
                    <fr:route>/graft/</fr:route>
                    <fr:title text="Graft">Graft</fr:title>
                    <fr:meta name="external">https://github.com/patricoferris/graft</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Graft is a <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> preprocessor.</html:p>
                    <html:p>It takes a forester (a directory of trees) written in a mixture of Markdown, Bibtex and <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax and produces a new forest completely written in <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax.</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>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Usage">Usage</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:code>graft</html:code> simply preprocesses a forest generating Forester trees from <html:code>.md</html:code>, <html:code>.bib</html:code> and <html:code>.tree</html:code> files. It will copy the structure of the input directory in the output directory.</html:p>
                        <html:pre class="hilite">
                          <html:code>
                            <html:span class="sh-source">$ graft preprocess --output=grafted-trees trees
</html:span>
                            <html:span class="sh-source">$ forester build
</html:span>
                          </html:code>
                        </html:pre>
                        <html:p>This assumes that you have updated your Forester <html:code>toml</html:code> file to put the <html:code>grafted-trees</html:code> directory as your source of trees.</html:p>
                        <html:pre><![CDATA[[forest]
trees = [ "grafted-trees" ]]]></html:pre>
                      </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>2025</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Example">Example</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A typical "tree" might look something like</html:p>
                        <html:pre><![CDATA[---
title: Opentrace and Supervisions
date: 2025-05-26
author: Patrick Ferris
---

Over the past two weeks I have mainly split my time (amongst many things) developing [opentrace](open-trace)
and doing revision supervisions.

```forester
\put\transclude/numbered{false}
\transclude{open-trace}
```]]></html:pre>
                        <html:p>A few things to note:</html:p>
                        <html:ol>
                          <html:li>
                            <html:p>The <html:code>yaml</html:code> frontmatter allows you to add some of the metadata fields from Forester.</html:p>
                          </html:li>
                          <html:li>
                            <html:p>At any point in your markdown there is an escape hatch to Forester using a <html:code>forester</html:code> codeblock.</html:p>
                          </html:li>
                        </html:ol>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>It is very satisfying to find the separation of concerns works quite well. For a while I had been rebasing my development branch on <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link>. I was also worried about trying to get the code upstream as it pulled in many dependencies. It seems that I have a very workable solution. I welcome contributions to <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> including extra input formats. I am also considering extending the <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> configuration to contain some <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> configuration for how it should generate new trees (e.g. at the moment every entry in a bibtex file is given a new tree).</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>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Maths Support">Maths Support</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>As part of that process, <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> now supports Markdown KaTeX. For example:</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:uri>https://patrick.sirref.org/mrdts/</fr:uri>
                        <fr:display-uri>mrdts</fr:display-uri>
                        <fr:route>/mrdts/</fr:route>
                        <fr:title text="Mergeable Replicated Data Type Implementation">Mergeable Replicated Data Type Implementation</fr:title>
                        <fr:taxon>Definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A <html:strong>mergeable replicated data type (MRDT) implementation</html:strong> for a data type <fr:tex display="inline"><![CDATA[\tau ]]></fr:tex> is a tuple <fr:tex display="inline"><![CDATA[D_{\tau } = (\Sigma , \sigma _{0}, do, merge)]]></fr:tex> where:</html:p>
                        <html:ul>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[\Sigma ]]></fr:tex> is the set of all possible states at a branch,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[\sigma _{0} \in  \Sigma ]]></fr:tex> is the initial state,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[do : Op_{\tau } \times  \Sigma  \times  Timestamp \rightarrow  \Sigma  \times  Val_{\tau }]]></fr:tex> implements every data type operation,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[merge : \Sigma  \times  \Sigma  \times  \Sigma  \rightarrow  \Sigma ]]></fr:tex> implements the <html:em>three-way merge strategy</html:em>.</html:p>
                          </html:li>
                        </html:ul>
                        <html:p><fr:link href="/kcrsk-mrdts-2022/" title="Certified mergeable replicated data types" uri="https://patrick.sirref.org/kcrsk-mrdts-2022/" display-uri="kcrsk-mrdts-2022" type="local">Definition 2.1 from "Certified Mergeable Replicated Data Types"</fr:link>.</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>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>2</fr:day>
                </fr:date>
                <fr:title text="Revision Supervisions">Revision Supervisions</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I have been doing revision supervisions for <fr:link href="/discrete-maths/" title="Discrete Mathematics" uri="https://patrick.sirref.org/discrete-maths/" display-uri="discrete-maths" type="local">Discrete Maths</fr:link> and <fr:link href="https://patrick.sirref.org/focs.md" type="external">Foundations of Computer Science</fr:link>. I have also been marking Operating Systems past paper questions for the same group of first years.</html:p>
              </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="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>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> (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>). 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> is a cornerstone library of the OCaml ecosystem (whether people like 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 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 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>
	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>
		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 histories directly into an interactive programming environment (a POSIX-like 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>, 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>, 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> (e.g. <html:code>jsont</html:code>) 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 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 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>).</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> 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>).</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: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>2025</fr:year>
              <fr:month>11</fr:month>
              <fr:day>5</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/ocaml-roundup-october-2025/</fr:uri>
            <fr:display-uri>ocaml-roundup-october-2025</fr:display-uri>
            <fr:route>/ocaml-roundup-october-2025/</fr:route>
            <fr:title text="OCaml Roundup: October 2025">OCaml Roundup: October 2025</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Welcome to a monthly roundup of OCaml-related open-source work I have been involved with. If you haven't already, a quick look at <fr:link href="/icfp-2025/" title="ICFP 2025" uri="https://patrick.sirref.org/icfp-2025/" display-uri="icfp-2025" type="local">my ICFP roundup</fr:link> might be a good preface to what follows.</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>11</fr:month>
                  <fr:day>5</fr:day>
                </fr:date>
                <fr:title text="Outreachy December 2025">Outreachy December 2025</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>The contribution period for this year's <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy</fr:link> round took place for most of the month of October. This year I am excited to be going back to a <fr:link href="/geocaml/" title="Geocaml" uri="https://patrick.sirref.org/geocaml/" display-uri="geocaml" type="local">Geocaml</fr:link> project, working primarily to add writing capabilities to <fr:link href="https://github.com/geocaml/ocaml-tiff" type="external">ocaml-tiff</fr:link>.</html:p>
                <html:p>As per usual, I have been extremely pleased with the level of interest in the various <fr:link href="https://www.outreachy.org/apply/project-selection/#ocaml" type="external">OCaml projects being offered</fr:link>. Whilst we are still deliberating on our choices for interns this year, I won't say much more on the contributions, but if you want to get involved please do reach out! OCaml is a great language for geospatial work, striking a balance between reasonable performance for numerical code and also a rich type system for expressing complicated geospatial data-structures.</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>2025</fr:year>
                  <fr:month>11</fr:month>
                  <fr:day>5</fr:day>
                </fr:date>
                <fr:title text="Ppxlib and the Future of Compiler Support">Ppxlib and the Future of Compiler Support</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> has put a tremendous amount of effort into laying a roadmap this month for <fr:link href="https://discuss.ocaml.org/t/ann-ppxlib-support-for-future-compilers/17430" type="external">how ppxlib, going forward, will support future compilers</fr:link>. This is in response to the calamity that was <fr:link href="/ppxlib-5-2/" title="Bumping Ppxlib's AST to 5.2" uri="https://patrick.sirref.org/ppxlib-5-2/" display-uri="ppxlib-5-2" type="local">bumping the internal AST to 5.2</fr:link>, and whilst I think we are adding a good deal more complexity, it will hopefully keep the ppx universe on an even keel for longer periods of time.</html:p>
                <html:p>The first <fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/607" type="external">substantial PR</fr:link> for this modern world of ppxlib is in review!</html:p>
                <html:p>Aside from that I also debugged an issue that lead to <fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/604" type="external">ppxlib OOM-ing</fr:link> machines... of course, any recursive fold-like loop where the accumulator keeps growing is likely to do that! It was nice to be able to crack out <fr:link href="https://blog.janestreet.com/finding-memory-leaks-with-memtrace/" type="external">memtrace</fr:link> to be able to hunt it down:</html:p>
                <html:img src="/bafkrmignyxory52fgqvdsqxqcd6dfifpiqrerqwcl6lbdy3gbj4ck46zee.png" />
              </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>2025</fr:year>
                  <fr:month>11</fr:month>
                  <fr:day>5</fr:day>
                </fr:date>
                <fr:title text="Incremental Directory Reading for Eio">Incremental Directory Reading for Eio</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A common tasks for many a CLI tool is to scan a directory of files, filter out the ones you are looking for and apply some transformation to said files. In fact, that is what <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> and <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> both do! A standard approach to this involves a recursive dance of <html:code>readdir</html:code> and <html:code>stat</html:code>, the former lists the entries in a directory whilst the latter lets you know what kind of file is at a particular path (e.g. symbolic link, directory etc.). This has a few downsides:</html:p>
                <html:ol>
                  <html:li>
                    <html:p>We're making <html:strong>two</html:strong> systems calls (pretty much one of the most expensive things your program can do).</html:p>
                  </html:li>
                  <html:li>
                    <html:p>If a directory contains thousands of files, we end up allocating a big list of strings after returning from <html:code>readdir</html:code>.</html:p>
                  </html:li>
                </html:ol>
                <html:p>On Linux, we can get around most of that with <fr:link href="https://linux.die.net/man/2/getdents64" type="external">getdents64(2)</fr:link> which allows us to <html:em>incrementally</html:em> read a directory. Whatsomore, this system call also returns the file type so there's no need to do an extra <html:code>stat</html:code>!</html:p>
                <html:p>I prototyped <fr:link href="https://github.com/ocaml-multicore/eio/pull/821" type="external">an implementation</fr:link> of this called <html:code>Eio.Path.walk</html:code> which looks like:</html:p>
                <html:pre class="hilite">
                  <html:code>
                    <html:span class="ocaml-keyword-other">val</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">walk</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language">_</html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-source">t</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"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-source"><![CDATA[(]]></html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">File</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Stat</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">kind</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-support-type">string</html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></html:span>
                    <html:span class="ocaml-source"> </html:span>
                    <html:span class="ocaml-constant-language-capital-identifier">Seq</html:span>
                    <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                    <html:span class="ocaml-source">t</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-storage-type">'a</html:span>
                    <html:span class="ocaml-source"><![CDATA[)]]></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-storage-type">'a</html:span>
                    <html:span class="ocaml-source">
</html:span>
                    <html:span class="ocaml-comment-doc"><![CDATA[(**]]></html:span>
                    <html:span class="ocaml-comment-doc"><![CDATA[ [walk t] traverses the directory [t] producing a sequence of results.]]></html:span>
                    <html:span class="ocaml-comment-doc"><![CDATA[*)]]></html:span>
                    <html:span class="ocaml-source">
</html:span>
                  </html:code>
                </html:pre>
                <html:p>We effectively halve the number of system calls. In a benchmark that traverse deeply-nested directories with plenty of files, a full traversal whent from <html:code>1.46s</html:code> to <html:code>110ms</html:code>. I have since rejigged the implementation to automatically recurse for the user into subdirectories (not that the signature is unchanged) which does make it tricky to control the number of open file descriptors compared to if the user were in control.</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>2025</fr:year>
                  <fr:month>11</fr:month>
                  <fr:day>5</fr:day>
                </fr:date>
                <fr:uri>https://patrick.sirref.org/icfp-oxcaml-uring/</fr:uri>
                <fr:display-uri>icfp-oxcaml-uring</fr:display-uri>
                <fr:route>/icfp-oxcaml-uring/</fr:route>
                <fr:title text="OxCaml Experiments ">OxCaml Experiments </fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I have included here a transclusion from my <fr:link href="/icfp-2025/" title="ICFP 2025" uri="https://patrick.sirref.org/icfp-2025/" display-uri="icfp-2025" type="local">ICFP</fr:link> post about an experiment using unboxed 32-bit integers in OCaml's Uring library.</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:uri>https://patrick.sirref.org/oxcaml-and-uring/</fr:uri>
                    <fr:display-uri>oxcaml-and-uring</fr:display-uri>
                    <fr:route>/oxcaml-and-uring/</fr:route>
                    <fr:title text="OxCaml and Uring">OxCaml and Uring</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Jane Street were a big presence at ICFP 2025, carting along with them a shiny new OCaml compiler: <fr:link href="https://oxcaml.org/" type="external">OxCaml</fr:link>. If have been <fr:link href="/try-oxcaml/" title="Try OxCaml" uri="https://patrick.sirref.org/try-oxcaml/" display-uri="try-oxcaml" type="local">playing around with OxCaml recently</fr:link> but nothing outside toplevels in Javascript. Until now!</html:p>
                    <html:p>After talking to <fr:link href="/dra27/" title="David Allsopp" uri="https://patrick.sirref.org/dra27/" display-uri="dra27" type="local">David</fr:link>, I spent some time converting a small corner of the <fr:link href="https://github.com/ocaml-multicore/ocaml-uring" type="external">ocaml-uring</fr:link> library to use a part of <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link>. In particular making the following change:</html:p>
                    <html:pre class="hilite">
                      <html:code>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">module</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-constant-language-capital-identifier">Heap</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">struct</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">    </html:span>
                        <html:span class="ocaml-keyword-other">type</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-source">ptr</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-support-type">int32</html:span>
                        <html:span class="ocaml-keyword-other">#</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">    </html:span>
                        <html:span class="ocaml-comment-block"><![CDATA[(*]]></html:span>
                        <html:span class="ocaml-comment-block"> ... </html:span>
                        <html:span class="ocaml-comment-block"><![CDATA[*)]]></html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">end</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">type</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-source">cqe</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-source">user_data_id</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-constant-language-capital-identifier">Heap</html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                        <html:span class="ocaml-source">ptr</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-source">res</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-support-type">int32</html:span>
                        <html:span class="ocaml-keyword-other">#</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-source"><![CDATA[}]]></html:span>
                        <html:span class="ocaml-source">
</html:span>
                      </html:code>
                    </html:pre>
                    <html:p>The idea being that a completion queue entry (a notification that some operation has completed) could be fully represented using 64 bits (two 32-bit, <fr:link href="https://oxcaml.org/documentation/unboxed-types/01-intro/" type="external">unboxed values</fr:link>). You can <fr:link href="https://github.com/ocaml-multicore/ocaml-uring/compare/main...patricoferris:ocaml-uring:oxcaml?expand=1" type="external">see how this impacted the library</fr:link>! I'm not certain about this change (and I'm sure I did it wrong) but it was nice to realise <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link> gives you this kind of control. However, I am worried about the ergonomics of manipulating values like <html:code>int32#</html:code> and the temptation to case it into an <html:code>int</html:code> (presumably losing a good portion of the value of having an unboxed value in the first place).</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>2025</fr:year>
                      <fr:month>11</fr:month>
                      <fr:day>5</fr:day>
                    </fr:date>
                    <fr:title text="x-ocaml with OxCaml">x-ocaml with OxCaml</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I sent <fr:link href="https://github.com/oxcaml/opam-repository/pull/19" type="external">a few PRs</fr:link> to the OxCaml repository to get the toplevel working again and lucky the underlying culprit for why patches were disappearing was found. Watch this space for a new toplevel in the browser soon.</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>2025</fr:year>
                  <fr:month>11</fr:month>
                  <fr:day>5</fr:day>
                </fr:date>
                <fr:title text="Geospatial OCaml">Geospatial OCaml</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>In addition to the <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy</fr:link> work I mentioned above, I also found the time to keep the <fr:link href="/geocaml/" title="Geocaml" uri="https://patrick.sirref.org/geocaml/" display-uri="geocaml" type="local">Geocaml</fr:link> project ticking along. A few projects saw some much-needed love including:</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>11</fr:month>
                      <fr:day>5</fr:day>
                    </fr:date>
                    <fr:title text="PROJ in OCaml">PROJ in OCaml</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <fr:link href="https://github.com/geocaml/ocaml-proj" type="external">modernisation of the bindings</fr:link> to <fr:link href="https://proj.org/en/stable/" type="external">PROJ</fr:link>. PROJ is probably the most used and tested code for working with geospatial projections. Any time you get a sateillite image or a blob of <fr:link href="https://github.com/geocaml/ocaml-geojson" type="external">GeoJSON</fr:link>, the geospatial data will normally have some coordinate reference system (CRS) with it detailing exactly what the numbers that tell you <html:em>where</html:em> something is mean. One of the most common being <fr:link href="https://en.wikipedia.org/wiki/World_Geodetic_System" type="external">WGS84</fr:link> (used by GPS and GeoJSON for example). Each CRS has its benefits and drawbacks, and often you will need to convert between them. That is what PROJ does.</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>2025</fr:year>
                      <fr:month>11</fr:month>
                      <fr:day>5</fr:day>
                    </fr:date>
                    <fr:title text="WKT in OCaml">WKT in OCaml</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Well-known Text (WKT) is a very simple encoding of geospatial objects and CRSs. For example, a polygon might look like:</html:p>
                    <html:pre><![CDATA[Polygon ((10 10, 10 20, 20 20, 20 15, 10 10))]]></html:pre>
                    <html:p>I used <fr:link href="https://ocaml.org/p/bytesrw" type="external">bytesrw</fr:link> to build a <fr:link href="https://github.com/geocaml/ocaml-wkt" type="external">simple codec for the WKT format</fr:link>. It is probably about time to write the basic geospatial object library too, something similar to <fr:link href="https://github.com/georust/geo" type="external">Rust's geo</fr:link> library.</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>2025</fr:year>
                      <fr:month>11</fr:month>
                      <fr:day>5</fr:day>
                    </fr:date>
                    <fr:title text="Geotessera">Geotessera</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A lot of people in <fr:link href="https://www.cst.cam.ac.uk/research/eeg" type="external">my group</fr:link> are excited about <fr:link href="/tessera2025/" title="TESSERA: Temporal Embeddings of Surface Spectra for Earth Representation and Analysis" uri="https://patrick.sirref.org/tessera2025/" display-uri="tessera2025" type="local">Tessera</fr:link>. They have made it easy to used the Tessera embeddings via a python library called <fr:link href="https://github.com/ucam-eo/geotessera" type="external">geotessera</fr:link>. In true OCaml-at-heart spirit, I tried my hand at <fr:link href="https://tangled.org/@patrick.sirref.org/ocaml-geotessera" type="external">porting this library</fr:link>. I had a good deal of success, converting the data into <fr:link href="https://ocaml.org/p/nx" type="external">Nx array</fr:link>, extracting the CRS and transform out of the GeoTIFF landmasks using <fr:link href="https://github.com/geocaml/ocaml-tiff" type="external">ocaml-tiff</fr:link>, reading datasets using <fr:link href="https://github.com/geocaml/ocaml-geojson" type="external">ocaml-geojson</fr:link> etc. This made me excited but also keen to improve the APIs of most of these libraries too.</html:p>
                    <html:p>I feel <fr:link href="/geocaml/" title="Geocaml" uri="https://patrick.sirref.org/geocaml/" display-uri="geocaml" type="local">geocaml</fr:link> is at a critical mass where we can start to have this useful feedback loop for the libraries because there is enough functionality to actually use them!</html:p>
                  </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>2025</fr:year>
              <fr:month>10</fr:month>
              <fr:day>24</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/icfp-2025/</fr:uri>
            <fr:display-uri>icfp-2025</fr:display-uri>
            <fr:route>/icfp-2025/</fr:route>
            <fr:title text="ICFP 2025">ICFP 2025</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Two weeks ago I was fortunate enough to attend the <fr:link href="https://icfp25.sigplan.org/" type="external">International Conference on Functional Programming</fr:link> in Singapore. My first time in Asia and my second time at the conference, what follows are some thoughts and presentations I enjoyed whilst I was there.</html:p>
            <html:p>I must thank my office mate (and friend!) <fr:link href="https://ryan.freumh.org/" type="external">Ryan Gibb</fr:link> for his camaraderie and sage advice: "the best track is <html:em>hallway</html:em> track". Not to mention all of his <fr:link href="https://ryan.freumh.org/photos.html" type="external">photos</fr:link> too. Thanks Ryan!</html:p>
            <html:div style="text-align: center">
  <html:img class="inner-img" src="/bafkrmid2d6u3qdufa6m5gogavtwm6uqksaicozrc5s2unrtzjtth3hpvey.jpeg" alt="Description follows image." />
</html:div>
            <html:p>From right to left, top to bottom: <fr:link href="https://patrick.sirref.org/anil madhavapeddy/" type="external">Anil Madhavapeddy</fr:link>, <fr:link href="https://patrick.sirref.org/sadiq jaffer/" type="external">Sadiq Jaffer</fr:link>, <fr:link href="https://patrick.sirref.org/patrick ferris/" type="external">Patrick Ferris</fr:link>, <fr:link href="https://patrick.sirref.org/ryan gibb/" type="external">Ryan Gibb</fr:link> and <fr:link href="https://patrick.sirref.org/roy ang/" type="external">Roy Ang</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>2025</fr:year>
                  <fr:month>10</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Random Hacking">Random Hacking</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Below are just some of the pieces of random hacking I got up to whilst in Singapore.</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:uri>https://patrick.sirref.org/oxcaml-and-uring/</fr:uri>
                    <fr:display-uri>oxcaml-and-uring</fr:display-uri>
                    <fr:route>/oxcaml-and-uring/</fr:route>
                    <fr:title text="OxCaml and Uring">OxCaml and Uring</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Jane Street were a big presence at ICFP 2025, carting along with them a shiny new OCaml compiler: <fr:link href="https://oxcaml.org/" type="external">OxCaml</fr:link>. If have been <fr:link href="/try-oxcaml/" title="Try OxCaml" uri="https://patrick.sirref.org/try-oxcaml/" display-uri="try-oxcaml" type="local">playing around with OxCaml recently</fr:link> but nothing outside toplevels in Javascript. Until now!</html:p>
                    <html:p>After talking to <fr:link href="/dra27/" title="David Allsopp" uri="https://patrick.sirref.org/dra27/" display-uri="dra27" type="local">David</fr:link>, I spent some time converting a small corner of the <fr:link href="https://github.com/ocaml-multicore/ocaml-uring" type="external">ocaml-uring</fr:link> library to use a part of <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link>. In particular making the following change:</html:p>
                    <html:pre class="hilite">
                      <html:code>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">module</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-constant-language-capital-identifier">Heap</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">struct</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">    </html:span>
                        <html:span class="ocaml-keyword-other">type</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-source">ptr</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-support-type">int32</html:span>
                        <html:span class="ocaml-keyword-other">#</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">    </html:span>
                        <html:span class="ocaml-comment-block"><![CDATA[(*]]></html:span>
                        <html:span class="ocaml-comment-block"> ... </html:span>
                        <html:span class="ocaml-comment-block"><![CDATA[*)]]></html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">end</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">
</html:span>
                        <html:span class="ocaml-source">  </html:span>
                        <html:span class="ocaml-keyword-other">type</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-source">cqe</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-source">user_data_id</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-constant-language-capital-identifier">Heap</html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-period punctuation-separator">.</html:span>
                        <html:span class="ocaml-source">ptr</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-source">res</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-keyword-other-ocaml punctuation-other-colon punctuation">:</html:span>
                        <html:span class="ocaml-source"> </html:span>
                        <html:span class="ocaml-support-type">int32</html:span>
                        <html:span class="ocaml-keyword-other">#</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-source"><![CDATA[}]]></html:span>
                        <html:span class="ocaml-source">
</html:span>
                      </html:code>
                    </html:pre>
                    <html:p>The idea being that a completion queue entry (a notification that some operation has completed) could be fully represented using 64 bits (two 32-bit, <fr:link href="https://oxcaml.org/documentation/unboxed-types/01-intro/" type="external">unboxed values</fr:link>). You can <fr:link href="https://github.com/ocaml-multicore/ocaml-uring/compare/main...patricoferris:ocaml-uring:oxcaml?expand=1" type="external">see how this impacted the library</fr:link>! I'm not certain about this change (and I'm sure I did it wrong) but it was nice to realise <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link> gives you this kind of control. However, I am worried about the ergonomics of manipulating values like <html:code>int32#</html:code> and the temptation to case it into an <html:code>int</html:code> (presumably losing a good portion of the value of having an unboxed value in the first place).</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>2025</fr:year>
                      <fr:month>10</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Bibtex Parser">Bibtex Parser</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>On the flight over to Singapore, I started to write a post for this website. Some readers may remember that I use <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">forester</fr:link> after a preprocessing step via <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> to build this site. Part of that preprocessing consumes bibtex files and outputs forester trees. For the initial <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> release I used the excellent <fr:link href="https://github.com/Octachron/talaria_bibtex" type="external">Talaria Bibtex</fr:link> library. Unfortunately, it presented a pretty confusing API that, whilst nicely typed, felt a little cumbersome to use. Additionally, it was too specific in what it would accept as valid Bibtex. I wanted something that was a little more straight-forward to use (if a little fast-and-loose when it comes to types...). And so I built <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">bib</fr:link>.</html:p>
                    <html:p>This was my first real attempt at using the <fr:link href="https://ocaml.org/p/bytesrw" type="external">Bytesrw</fr:link> library. I was happy with the results, although I did have to copy a substantial amount of code from <fr:link href="https://ocaml.org/p/jsont" type="external">other bytesrw-compatible libraries</fr:link>. I'd be happy to shift to this <html:code>bytes</html:code>-first world if it wasn't for the ever-present-in-my-mind issue of relocatable values in the OCaml heap!</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>2025</fr:year>
                      <fr:month>10</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Geocaml Libraries">Geocaml Libraries</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>There has been some excellent <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">outreachy</fr:link> work happening on the <fr:link href="https://github.com/geocaml/ocaml-tiff" type="external">geocaml/ocaml-tiff</fr:link> library which is a potential Outreachy internship project for December 2025. More on this in a future post.</html:p>
                    <html:p>On the way back (and a little during the conference), I spent some time building an OCaml counterpart to <fr:link href="https://github.com/ucam-eo/geotessera/" type="external">geotessera</fr:link>, a library for working with <fr:link href="/tessera2025/" title="TESSERA: Temporal Embeddings of Surface Spectra for Earth Representation and Analysis" uri="https://patrick.sirref.org/tessera2025/" display-uri="tessera2025" type="local">Tessera</fr:link>. The library is not ready for people to use directly, but I was working on various constituent parts including:</html:p>
                    <html:ul>
                      <html:li>
                        <html:p><fr:link href="https://github.com/geocaml/ocaml-proj" type="external">Modern OCaml bindings to PROJ</fr:link> (a coordinate reference system projection library)</html:p>
                      </html:li>
                      <html:li>
                        <html:p>
                          <fr:link href="https://github.com/geocaml/ocaml-wkt" type="external">Further work on a WKT library for OCaml</fr:link>
                        </html:p>
                      </html:li>
                      <html:li>
                        <html:p>Coming soon... ocaml-geotessera</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>2025</fr:year>
                  <fr:month>10</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Talks">Talks</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>2025</fr:year>
                      <fr:month>10</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Hazel of OCaml at TyDe">Hazel of OCaml at TyDe</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The <html:em>type-driven development</html:em> (TyDe) workshop was held on the first day of ICFP at the <fr:link href="https://www.comp.nus.edu.sg/" type="external">NUS School of Computing</fr:link>. I find the workshop name to be a little misleading, but perhaps this comes from my engineering background. The talks focused a lot on type <html:em>theory</html:em>, presenting the formal mathematics of interesting type systems with less focus on <html:em>why</html:em> it might be useful to have such an exotic type system... but then again, that was the nature of the entire conference.</html:p>
                    <html:p>I presented a talk on <fr:link href="/hazel-of-ocaml/" title="A Transpiler from OCaml to Hazel" uri="https://patrick.sirref.org/hazel-of-ocaml/" display-uri="hazel-of-ocaml" type="local">hazel_of_ocaml</fr:link>. The <fr:link href="https://patrick.sirref.org/var/tyde2025.pdf" type="external">slides are here</fr:link>, along with the <fr:link href="https://patrick.sirref.org/var/tyde2025-ea.pdf" type="external">extended abstract</fr:link>. My talk ended up focusing a lot on the pedagogical benefits of having a type system that helped explain the most important thing a type system does... catch type errors! This work represents a small piece of work inside <fr:link href="https://maxcarroll0.github.io/" type="external">Max Carroll's</fr:link> excellent <fr:link href="/part-ii-hazel/" title="Type Error Debugging in Hazel" uri="https://patrick.sirref.org/part-ii-hazel/" display-uri="part-ii-hazel" type="local">part II</fr:link> project, which he presented at the <fr:link href="https://maxcarroll0.github.io/papers/workshops/HATRA-decomposable-type-highlighting/" type="external">HATRA workshop</fr:link>: <html:em>Decomposable Type Highlighting for Bidirectional Type and Cast Systems</html:em>.</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>2025</fr:year>
                      <fr:month>10</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Scientific Programming at PROPL">Scientific Programming at PROPL</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I think it is important to be honest whenever you get a talk accepted that you otherwise feel should not have been. My talk "<html:em>about scientific programming what we talk about when we talk</html:em>" is one such talk. The <fr:link href="https://patrick.sirref.org/var/propl2025.pdf" type="external">slides are here</fr:link>. The talk itself was nothing to write home about, but I think there were a few nice ideas that came out of it and the conversations I had with fellow PROPL attenders.</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>10</fr:month>
                          <fr:day>24</fr:day>
                        </fr:date>
                        <fr:title text="TMF Data Discrepancies Redux">TMF Data Discrepancies Redux</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>On the eve of my talk, I decided to re-run some analysis I did a few years ago on the <fr:link href="https://forobs.jrc.ec.europa.eu/TMF/data#downloads" type="external">tropical moist forest dataset</fr:link>, knowing that since then a few more years had become available. After fighting with some bit-rot in the Google Earth Engine script I had used, the new results were not very uplifting.</html:p>
                        <html:table>
    <html:tbody>
    <html:tr>
    <html:td><html:strong>Land Use Class</html:strong></html:td>
    <html:td><html:strong>Percent Change</html:strong></html:td>
    </html:tr>
    <html:tr>
    <html:td>Undisturbed</html:td>
    <html:td> -2.9</html:td>
    </html:tr>
    <html:tr>
    <html:td>Degraded</html:td>
    <html:td> -5.5</html:td>
    </html:tr>
    <html:tr style="background: yellow">
    <html:td>Deforested</html:td>
    <html:td> 8.6</html:td>
    </html:tr>
    <html:tr>
    <html:td>Regrowth</html:td>
    <html:td> 0.5</html:td>
    </html:tr>
    <html:tr>
    <html:td>Water</html:td>
    <html:td> 0.0</html:td>
    </html:tr>
    <html:tr>
    <html:td>Other</html:td>
    <html:td>-0.6</html:td>
    </html:tr>
    </html:tbody>
</html:table>
                        <html:p>The data in the table corresponds to the land use class values in Indonesia in the year 2008. The analysis computed the difference across each of the classes between the dataset released in 2021 and the dataset released in 2024. Most notably, the amount of deforested land has gone up by <html:em>8.6</html:em> percent!</html:p>
                        <html:p>As a somewhat tangential, though related, aside, I had the pleasure of talking to <fr:link href="https://cs.nyu.edu/~shw8119/" type="external">Sam Westrick</fr:link>, <fr:link href="https://forthoney.github.io/" type="external">Seong-Heon Jung</fr:link> and <fr:link href="https://svishnus.github.io/" type="external">Sundara Vishnu Satish</fr:link> of the <fr:link href="https://nyu-parcour.github.io/" type="external">ParCour</fr:link> research group. They were telling me about <fr:link href="https://github.com/mpllang/mpl" type="external">MaPLe</fr:link>, a programming language from the MLs built for parallelism. We discussed some ideas of using real-world, geospatial algorithms as benchmarks for MaPLe. <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael</fr:link>, if you got this far remind me to chat to you about this!</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>2025</fr:year>
                          <fr:month>10</fr:month>
                          <fr:day>24</fr:day>
                        </fr:date>
                        <fr:title text="Shelter Reactions">Shelter Reactions</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>At the end of my talk, I briefly mentioned <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shelter</fr:link>. By far, this was the topic I got the most engagement on post-talk. During the conference, this was also true when people asked what I was working on. The tag line "a shell with <html:em>undo</html:em>" seemed to capture the attention of most people.</html:p>
                        <html:p>I'm feeling a renewed sense of interest in my own work thanks to that, even if the "research" contributions are not very apparent. However, I also had a good discussion with <fr:link href="https://kcsrk.info/" type="external">KC</fr:link> about the underlying <fr:link href="https://patrick.sirref.org/mrdt/" type="external">MRDT</fr:link> in <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">Shelter</fr:link> and how we might think about collaborating in the future on MRDT-related work.</html:p>
                        <html:p>Related to that, I managed to spend the evening in <fr:link href="https://www.openstreetmap.org/relation/18195609#map=16/1.28090/103.84222" type="external">Chinatown</fr:link> with <fr:link href="https://dynamicaspects.org/research/" type="external">Roly Perera</fr:link>. Roly's work has focused on <fr:link href="https://f.luid.org/" type="external">Fluid</fr:link>, a transparency-based programming language that allows authors to reveal their computation to their user. Excitingly, Roly presented a <fr:link href="https://conf.researchr.org/details/icfp-splash-2025/propl-2025-papers/10/Authoring-Tools-for-Transparent-Climate-Reporting" type="external">new text-based part of the language</fr:link> at PROPL. Our work is in the same universe, loosely orbiting some notion of reproducibility and explainability, but quite different in engineering work and how users might actually interact with our systems. I thoroughly enjoyed talking about solutions or research ideas that <html:em>preserve</html:em> existing workflows. Roly was great at pulling that out of the current work I have been doing.</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>2025</fr:year>
                  <fr:month>10</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Other Talks and Highlights">Other Talks and Highlights</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I was a part of, often in a very small way, some other talks that were presented at ICFP including</html:p>
                <html:ul>
                  <html:li>
                    <html:p><fr:link href="https://www.youtube.com/watch?v=j84ocjlj1JA&amp;amp;t=12880s" type="external">Functional Networking for Docker</fr:link>, I encourage you to read <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil's</fr:link> <fr:link href="https://anil.recoil.org/notes/icfp25-ocaml5-js-docker#functional-networking-at-docker" type="external">notes on the topic</fr:link>. It is also worth mentioning <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil's</fr:link> <fr:link href="https://anil.recoil.org/notes/icfp25-post-posix" type="external">post-posix talk</fr:link> (not unrelated to my Uring musings above).</html:p>
                  </html:li>
                  <html:li>
                    <html:p><fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael</fr:link> gave an excellent, <html:em>very live</html:em>, talk about <fr:link href="https://conf.researchr.org/details/icfp-splash-2025/propl-2025-papers/6/Yirgacheffe-a-declarative-approach-to-geospatial-data" type="external">Yirgacheffe</fr:link> at PROPL which I thoroughly enjoyed. I'm also excited about his recent developments which I'm sure you can clue into <fr:link href="https://digitalflapjack.com/weeknotes/" type="external">over on his blog</fr:link>.</html:p>
                  </html:li>
                </html:ul>
                <html:p>Below is a non-exhaustive list of talks I enjoyed whilst at the conference. Some relevant, most of them not!</html:p>
                <html:ul>
                  <html:li>
                    <html:p>By far, one of the best talks was <fr:link href="https://icfp25.sigplan.org/details/icfp-2025-papers/13/Polynomial-Time-Program-Equivalence-for-Machine-Knitting" type="external">Polynomial-time Program Equivalence for Machine Knitting</fr:link>. I think the talk really nailed the "here's the idea, the details are in the paper"-presenting style as they described an "...algorithm that canonicalizes the algebraic representations of the topological semantics of machine knitting programs".</html:p>
                  </html:li>
                  <html:li>
                    <html:p>I attended most of the <fr:link href="https://conf.researchr.org/details/icfp-splash-2025/icfp-splash-2025-tutorials/5/A-guided-tour-through-Oxidized-OCaml" type="external">OxCaml tutorial</fr:link> presented by the incredibly friendly <fr:link href="https://gavinleroy.com/" type="external">Gavin Gray</fr:link>.</html:p>
                  </html:li>
                  <html:li>
                    <html:p><fr:link href="/ryangibb/" title="Ryan Gibb" uri="https://patrick.sirref.org/ryangibb/" display-uri="ryangibb" type="local">Ryan</fr:link>'s talk <fr:link href="https://conf.researchr.org/details/icfp-splash-2025/propl-2025-papers/13/Spatial-Programming-for-Environmental-Monitoring" type="external">Spatial Programming for Environmental Monitoring</fr:link> at PROPL was excellent.</html:p>
                  </html:li>
                </html:ul>
                <html:p>There's plenty more to talk about, and I'm sure my future posts will reference other parts of my experience at ICFP 2025. Thanks for reading, and if anybody is interested in any aspects of this do reach out!</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>2025</fr:year>
              <fr:month>7</fr:month>
              <fr:day>31</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/ocaml-weekly-2025-w30-w31/</fr:uri>
            <fr:display-uri>ocaml-weekly-2025-w30-w31</fr:display-uri>
            <fr:route>/ocaml-weekly-2025-w30-w31/</fr:route>
            <fr:title text="OCaml Weekly 2025 w30 and w31">OCaml Weekly 2025 w30 and w31</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>A bumper edition today, a fortnightly.</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>7</fr:month>
                  <fr:day>31</fr:day>
                </fr:date>
                <fr:title text="Opam Releases">Opam Releases</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I did a little personal spring-cleaning of packages I maintain and pushed a few releases to opam. This included a <fr:link href="https://github.com/ocaml/opam-repository/pull/28187" type="external">0.1.0 release</fr:link> of <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link>! There is some light documentation online at <fr:link href="https://graft.sirref.org/" type="external">https://graft.sirref.org</fr:link>.</html:p>
                <html:p>Elsewhere, <fr:link href="https://github.com/patricoferris/hilite" type="external">Hilite</fr:link> got a <fr:link href="https://github.com/ocaml/opam-repository/pull/28172" type="external">0.5.0 release</fr:link>. This release makes the core syntax highlighting separate from the markdown part of the library. You can now <fr:link href="https://ocaml.org/p/hilite/latest/doc/hilite/Hilite/index.html#val-src_code_to_pairs" type="external">generate pairs of tokens and identifiers</fr:link> to plug into any "OCaml sourcecode to format" tool you might be building (e.g. <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>31</fr:day>
                </fr:date>
                <fr:title text="Interactive OCaml Presentations">Interactive OCaml Presentations</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I had fun trying to fuse slipshow and x-ocaml!</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>23</fr:day>
                    </fr:date>
                    <fr:uri>https://patrick.sirref.org/slipshow-x-xocaml/</fr:uri>
                    <fr:display-uri>slipshow-x-xocaml</fr:display-uri>
                    <fr:route>/slipshow-x-xocaml/</fr:route>
                    <fr:title text="Slipshow x x-ocaml">Slipshow x x-ocaml</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A short, explanatory post about combining two very fun pieces of work in OCaml.</html:p>
                    <html:p><fr:link href="https://github.com/panglesd" type="external">Paul-Elliot</fr:link> has been building <fr:link href="https://github.com/panglesd/slipshow" type="external">Slipshow</fr:link> for some time now where slides are <html:em>slips</html:em> and your presentations run vertically. More recently, <fr:link href="/artw/" title="Arthur Wendling" uri="https://patrick.sirref.org/artw/" display-uri="artw" type="local">Arthur</fr:link> has built <fr:link href="https://github.com/art-w/x-ocaml" type="external">x-ocaml</fr:link>, a web component library for executable OCaml cells embedded into OCaml.</html:p>
                    <html:p>Using <fr:link href="https://github.com/patricoferris/xocmd" type="external">xocmd</fr:link>, a small tool I built for translating markdown codeblocks to x-ocaml components, your Slipshow's can now be <html:em>executable</html:em>!</html:p>
                    <html:pre><![CDATA[xocmd learn-effects.md | slipshow compile - > learn-effects.html]]></html:pre>
                    <html:p>
    Take a look at 
    <html:a href="/bafkrmictvc3ap2ah37cbcdoo6rsl7vxqu6srogmgzx6iml45bq7zz5weo4.html">an example</html:a>!
    (or the 
    <html:a href="/bafkrmib3jugpkznxcftqjvhbbtfqgx4oz2m32p5xloh4nxia3lhxy2momq.md">source markdown</html:a>).
</html:p>
                    <html:p>I really like this light-weight approach to building interactive presentations for explaining things in OCaml (e.g. over running a jupyter notebook server).</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>I tried using x-ocaml with <fr:link href="https://irmin.org/" type="external">Irmin</fr:link> and something is not quite right with some of the runtime JS code being generated (<fr:link href="https://github.com/art-w/x-ocaml/issues/11" type="external">see the issue in case you can help</fr:link>). This was intended to be used alongside a longer-form retrospective I am writing on my use of Irmin over the years.</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>31</fr:day>
                </fr:date>
                <fr:title text="Outreachy">Outreachy</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I have been helping <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael's</fr:link> intern whilst he has been away on their project <fr:link href="https://github.com/claudiusFX/claudius" type="external">Claudius</fr:link>. It has reminded me, again, how inpenetretable some of OCaml's tooling is. In this case the generation of opam files from dune-project files, and in particular, the required <html:em>manual</html:em> steps when you wish to remove a dependency (1. remove it from the <html:code>dune-project</html:code> file, 2. run <html:code>dune build</html:code> to update the opam file, 3. remove all occurences of the library from <html:code>dune</html:code> files across your project).</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>31</fr:day>
                </fr:date>
                <fr:title text="Ppxlib">Ppxlib</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Work on <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib</fr:link> has been fairly varied this past two weeks. I mentioned before about an exiting plan <fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan</fr:link> has planned to help ease the burden on ppxlib maintainers and ppx authors whenever there is an OCaml parsetree bump. That, however, is currently shelved as we are dealing with the fall out of <fr:link href="/ppxlib-5-2/" title="Bumping Ppxlib's AST to 5.2" uri="https://patrick.sirref.org/ppxlib-5-2/" display-uri="ppxlib-5-2" type="local">the 5.2 bump</fr:link>. <fr:link href="https://github.com/mirage/repr/pull/110" type="external">Repr</fr:link> got some fixes pushed to it, but this unconvered <fr:link href="https://github.com/ocaml-ppx/ppxlib/pull/588" type="external">more issues</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>31</fr:day>
                </fr:date>
                <fr:title text="Misc.">Misc.</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I spent some time cleaning up <fr:link href="https://github.com/quantifyearth/container-image" type="external">container-image</fr:link>, a tool primarily written by <fr:link href="https://github.com/samoht" type="external">Thomas G.</fr:link> to fetch OCI images from repositories. The <fr:link href="https://github.com/quantifyearth/container-image/pull/5" type="external">tidy up</fr:link> went surprisingly well, except for some spurious HTTP errors with AWS. Maybe I'll spend some proper time trying to help the state of HTTP clients in OCaml (of which there are many, but few that work very well out of the box in my experience).</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>2025</fr:year>
              <fr:month>7</fr:month>
              <fr:day>18</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/ocaml-quarterly-q2/</fr:uri>
            <fr:display-uri>ocaml-quarterly-q2</fr:display-uri>
            <fr:route>/ocaml-quarterly-q2/</fr:route>
            <fr:title text="Quarterly OCaml Q2">Quarterly OCaml Q2</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Thanks to <fr:link href="https://patrick.sirref.org/tarides/" type="external">Tarides</fr:link> sponsorship, I get to work on open-source OCaml. This quarterly is a companion to my <fr:link href="/weeklies/" title="Patrick Ferris' Weeklies" uri="https://patrick.sirref.org/weeklies/" display-uri="weeklies" type="local">weeklies</fr:link>, summarising the last three months of development, peppered with ideas and thoughts about OCaml, its community and its future.</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>7</fr:month>
                  <fr:day>18</fr:day>
                </fr:date>
                <fr:title text="What I wanted to work on?">What I wanted to work on?</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>There were two main things I hoped to <html:em>continue</html:em> working on: <html:strong>ppxlib</html:strong> and <html:strong>outreachy</html:strong>. These are projects that I was previously working on, and in the case of Outreachy I have now been involved for many years.</html:p>
                <html:p>In addition to this, all of my <fr:link href="/part-ii-2024/" title="Part II Students 2024" uri="https://patrick.sirref.org/part-ii-2024/" display-uri="part-ii-2024" type="local">Part II</fr:link> projects this year used OCaml in some regard. In general, I want to see more adoption of OCaml. Over the years this has taken many forms including <fr:link href="https://ocaml-explore.netlify.app/" type="external">my initial work on developing workflows for OCaml that just turned five years old</fr:link>. This directly fed into the rebranding and rethinking of <fr:link href="https://ocaml.org/" type="external">ocaml.org</fr:link> itself.</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>18</fr:day>
                </fr:date>
                <fr:title text="What I worked on?">What I worked on?</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>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:title text="Ppxlib">Ppxlib</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib</fr:link> is the de facto standard library for building OCaml preprocessors. At the time of writing, <html:code>opam list --depends-on=ppxlib</html:code> informs me that there are 267 reverse dependencies. <fr:link href="https://www.janestreet.com/" type="external">Janestreet</fr:link> is a heavy user of ppxes and has <fr:link href="https://github.com/orgs/janestreet/repositories?language=&amp;amp;q=ppx&amp;amp;sort=&amp;amp;type=all" type="external">authored many</fr:link>.</html:p>
                    <html:p>One of the main accomplishments this quarter was <fr:link href="/ppxlib-5-2/" title="Bumping Ppxlib's AST to 5.2" uri="https://patrick.sirref.org/ppxlib-5-2/" display-uri="ppxlib-5-2" type="local">bumping the internal AST to 5.2</fr:link>. This allows ppx authors to use new OCaml language features in their ppxes. In bumping the AST, we knowingly broke compatability for pretty much every single reverse dependency. As best we can, we have been sending patches to ppx libraries and helping users migrate to the latest <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link>.</html:p>
                    <html:p>There is an interesting dicussion to had about the nature of open-source, and its interaction with industrial monorepos and community tended package repositories. Package ecosystems thrive whenever there is a dedicated community creating, maintaining and publishing packages. The idea is that the published world should be healthy. The publishing medium can act as natural limiting factor in the churn of breaking changes (in the case of OCaml this is via <fr:link href="https://github.com/ocaml/opam-repository/" type="external">PRs to the opam-repository</fr:link>). This, I have come to notice, reacts poorly to changes coming from internally consistent monorepos where introducing breaking changes is easily fixed by applying patches there and then. Whatsmore, OCaml is often stated as an incredibly safe language to perform large refactorings thanks to its type system.</html:p>
                    <html:p><fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib</fr:link> sits awkwardly in the space of possible breaking changes. Tied to OCaml's parsetree, impacts of changes there ripple down to <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link>. The compiler itself can remain internally consistent, and is protected as it need only parse source code. <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">Ppxlib</fr:link>, on the other hand, exposes the parsetree to users and thus any changes to the parsetree will likely be felt by ppx authors. Since I started working on <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link>, it feels as though the number of syntax changes has gone up (primarily from Janestreet work). Unless we make changes to how we provide support for these, maintainers of <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link> will forever be stuck doing busy work! Thankfully, <fr:link href="/nathanreb/" title="Nathan Rebours" uri="https://patrick.sirref.org/nathanreb/" display-uri="nathanreb" type="local">Nathan</fr:link> <fr:link href="/ocaml-weekly-2025-w29/" title="OCaml Weekly 2025 w29" uri="https://patrick.sirref.org/ocaml-weekly-2025-w29/" display-uri="ocaml-weekly-2025-w29" type="local">has thoughts on how to improve this</fr:link>.</html:p>
                    <html:p>There are a slew of other features I have added to <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link> including:</html:p>
                    <html:ul>
                      <html:li>
                        <html:p>Support for deriving from classes.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>Support for deriving from module bindings and signatures.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>Fixing compiler and ppxlib dummy locations.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>Bumping to 5.3.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>Migrations for 5.4.</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>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:title text="Outreachy">Outreachy</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Our two projects this year, one on <fr:link href="https://github.com/claudiusFX/claudius" type="external">claudius</fr:link> and one on <fr:link href="https://github.com/ocaml/dune" type="external">dune</fr:link>, are going extremely well. At the time of writing, we just had <fr:link href="/ocaml-weekly-2025-w29/" title="OCaml Weekly 2025 w29" uri="https://patrick.sirref.org/ocaml-weekly-2025-w29/" display-uri="ocaml-weekly-2025-w29" type="local">a mid-internship call to catch up</fr:link>, and I was blown away by the progress each intern has made. Unfortunately, <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy</fr:link> is struggling with funding and the next round is perhaps not going to happen. This is a real shame and I am hoping that it will not be the case.</html:p>
                    <html:p>Outreachy has been a wonderful source of new, committed OCaml developers. If you haven't already, do peruse the <fr:link href="https://ocaml.org/outreachy" type="external">webpage on OCaml.org</fr:link> to see past internships or <fr:link href="https://watch.ocaml.org/c/outreachy_ocaml/videos" type="external">watch the demo day presentations</fr:link>. For the mentors involved, I believe it has also been a rewarding experience (though at times a challenging one). We are always looking for new mentors and project ideas, please <fr:link href="/patrickferris/" title="Patrick Ferris" uri="https://patrick.sirref.org/patrickferris/" display-uri="patrickferris" type="local">do reach out to me</fr:link> if you are interested.</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>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:title text="Hazel">Hazel</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>OCaml's feature set allows it to shine at writing programming languages (and things of that ilk: compilers, interpretters, static analysis tools). <fr:link href="/hazel/" title="Hazel" uri="https://patrick.sirref.org/hazel/" display-uri="hazel" type="local">Hazel</fr:link> is a research programming language with typed holes written completely in OCaml (via the <fr:link href="https://reasonml.github.io/" type="external">reason dialect</fr:link>).</html:p>
                    <html:p>Relating this back to the original intent of my work, to improve OCaml adoption, I believe this also means keeping existing users happy. In the last quarter I developed a compiler from <fr:link href="/hazel_of_ocaml/" title="hazel_of_ocaml" uri="https://patrick.sirref.org/hazel_of_ocaml/" display-uri="hazel_of_ocaml" type="local">OCaml to Hazel</fr:link>. Whilst new features are still being added to <fr:link href="/hazel/" title="Hazel" uri="https://patrick.sirref.org/hazel/" display-uri="hazel" type="local">Hazel</fr:link>, I hope this could serve as a tool to help develop test-suites and standard library functions using existing OCaml solutions. In a student's work (<fr:link href="/part-ii-hazel/" title="Type Error Debugging in Hazel" uri="https://patrick.sirref.org/part-ii-hazel/" display-uri="part-ii-hazel" type="local">Typed Debugging for Hazel</fr:link>), we used this tool to build a corpus of ill-typed <fr:link href="/hazel/" title="Hazel" uri="https://patrick.sirref.org/hazel/" display-uri="hazel" type="local">Hazel</fr:link> programs to great effect.</html:p>
                    <html:p>OCaml should continue to be a world-class programming language for building other programming languages. I hope to upstream some of this work to <fr:link href="/hazel/" title="Hazel" uri="https://patrick.sirref.org/hazel/" display-uri="hazel" type="local">Hazel</fr:link> and provide some low effort maintenance to help keep their compiler in good shape.</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>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:title text="Systems Programming in OCaml">Systems Programming in OCaml</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>In a cross-over with my own research, I have been developing many tools related to systems programming in OCaml including:</html:p>
                    <html:ul>
                      <html:li>
                        <html:p>An eBPF-based <fr:link href="/open-trace/" title="Opentrace" uri="https://patrick.sirref.org/open-trace/" display-uri="open-trace" type="local"><html:code>open</html:code> syscall tracing tool</fr:link>.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>A library in OCaml for <fr:link href="https://github.com/quantifyearth/void" type="external">spawning void processes</fr:link>.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>A <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shell session manager</fr:link> that uses <fr:link href="https://irmin.org/" type="external">Irmin</fr:link> to manage sessions. It is nice to see a new push to <fr:link href="https://github.com/mirage/irmin/pull/2149" type="external">finally land the direct-style Irmin PR</fr:link>!</html:p>
                      </html:li>
                    </html:ul>
                    <html:p>This work is means to develop the underlying libraries that support it. For example, I have opened a few PRs to <fr:link href="https://github.com/ocaml-multicore/eio" type="external">Eio</fr:link> to add new "fork actions" to the spawn API. I also investigated the feasibility of changing the underlying mechanisms in <fr:link href="/eio/" title="Eio" uri="https://patrick.sirref.org/eio/" display-uri="eio" type="local">Eio</fr:link> to use <fr:link href="https://github.com/ocaml-multicore/picos" type="external">Picos</fr:link>. In the future, I think this could be important avoid further splitting the OCaml ecosystem.</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>7</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="OxCaml">OxCaml</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>I dabbled a little with <fr:link href="https://oxcaml.org/" type="external">OxCaml</fr:link> and build <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> to let people take it for a spin without having to perform opam repository gymnastics. It turned into a lot of work to track down some pretty inane bugs (type definitions differeing between js_of_ocaml and the OxCaml compiler, resulting in different Javascript runtime representations...).</html:p>
                        <html:p>This unblocked a few of my colleagues to get OxCaml working on tools like <fr:link href="https://jon.recoil.org/notebooks/foundations/foundations1.html" type="external">odoc_notebooks</fr:link> and <fr:link href="https://github.com/art-w/x-ocaml" type="external">x-ocaml</fr:link>.</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>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:title text="Forester">Forester</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A good proportion of my work this quarter has been focused on how to present the very work that I am doing. <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://patrick.sirref.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link> has been developing a tool for scientific thought called <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> which seemed like a possible candidate for writing and sharing my work.</html:p>
                    <html:p>Porting my existing blog posts and website content from markdown to Forester's LaTeX-inspired syntax didn't seem like an option. In particular, many of my posts made use of additional markdown-based tools (like <fr:link href="https://github.com/realworldocaml/mdx" type="external">ocaml-mdx</fr:link>).</html:p>
                    <html:p>This lead to the development of <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link>: a preprocessor for Forester forests, converting markdown and bibtex to trees.</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>18</fr:day>
                </fr:date>
                <fr:title text="What's next?">What's next?</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>So, I worked on most of what I wanted to work on and then some! Going forward I hope to keep maintaining <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link> in some capacity and coordinating the OCaml community's <fr:link href="/outreachy/" title="Outreachy" uri="https://patrick.sirref.org/outreachy/" display-uri="outreachy" type="local">Outreachy</fr:link> efforts.</html:p>
                <html:p>I hope to continue my small experiments (e.g. converting Eio to Picos). My own research makes heavy use of Irmin, and I would be interested to help with that too. More recently, a new library has been released for working with numerical data in OCaml called <fr:link href="https://github.com/raven-ml/" type="external">Raven</fr:link>: I am interested to use this library in <fr:link href="/geocaml/" title="Geocaml" uri="https://patrick.sirref.org/geocaml/" display-uri="geocaml" type="local">Geocaml</fr:link>, a suite of geospatial tools written in OCaml that I maintain.</html:p>
                <html:p>I feel conflicted about the <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link> efforts. I admit, I am not fully aware of the full benefits of the features, but I worry about some proliferation of modes that make the type system in OCaml unbearable to use. On top of this, with my <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link> hat on, I worry about the impact of changing the compiler so frequently, placing strain on an already small community. That being said, by releasing <fr:link href="https://patrick.sirref.org/oxcaml/" type="external">OxCaml</fr:link> separately I do believe running it as an experimental set of packages will help understand the tool better. But I would not be building anything I intend to maintain or research with right now as that ecosystem is far too volatile.</html:p>
                <html:p>Finally, over the past two years I have done a lot of teaching. From <fr:link href="/part-ii/" title="Part II Projects" uri="https://patrick.sirref.org/part-ii/" display-uri="part-ii" type="local">Part II projects</fr:link> to <fr:link href="/focs/" title="Foundations of Computer Science" uri="https://patrick.sirref.org/focs/" display-uri="focs" type="local">supervisions</fr:link>. Going into next (academic) year, I intend to reduce my in-person teaching to focus on my research. However, I am interested in producing more materials for learning, maybe some of this in OCaml, perhaps something similar to <fr:link href="https://beautifulracket.com/" type="external">Beautiful Racket</fr:link>. I have tried in the past to do these sorts of things, for example <fr:link href="https://patricoferris.github.io/irmin-book/" type="external">The Irmin Book</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>2025</fr:year>
                  <fr:month>7</fr:month>
                  <fr:day>18</fr:day>
                </fr:date>
                <fr:title text="Thank you">Thank you</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Thank you for reading this wrap up! And thank you again to <fr:link href="https://patrick.sirref.org/tarides/" type="external">Tarides</fr:link> for letting me work so freely on things that I think are good for the OCaml community.</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>2025</fr:year>
              <fr:month>6</fr:month>
              <fr:day>30</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/rest-of-monthly-2025-06/</fr:uri>
            <fr:display-uri>rest-of-monthly-2025-06</fr:display-uri>
            <fr:route>/rest-of-monthly-2025-06/</fr:route>
            <fr:title text="PhD Work and Scientific Programming">PhD Work and Scientific Programming</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>I have been away on holidays. Some of that was spent hiking in the Massif de Calanques in Marseille, unfortunately this week <fr:link href="https://www.theguardian.com/world/2025/jul/08/marseille-airport-cancels-all-flights-as-wildfire-encroaches-on-city" type="external">they were on fire</fr:link>. Anyway, this "weekly" fills in the blanks for the rest of June 2025.</html:p>
            <html:p style="text-align: center">
  <html:img width="320" alt="A Calanque just outside of Marseille, a canyon-like structure of calcified stone on the edge of the Mediterranean." src="/bafkrmigalfmuwbf6l6lpj5wbkmxz25qrwtoe536sjogt42rhagtorfyu54.jpg" />
</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>6</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="Revisiting hazel_of_ocaml">Revisiting <fr:link href="/hazel_of_ocaml/" title="hazel_of_ocaml" uri="https://patrick.sirref.org/hazel_of_ocaml/" display-uri="hazel_of_ocaml" type="local">hazel_of_ocaml</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I spent some time thinking and writing about <fr:link href="/hazel_of_ocaml/" title="hazel_of_ocaml" uri="https://patrick.sirref.org/hazel_of_ocaml/" display-uri="hazel_of_ocaml" type="local">hazel_of_ocaml</fr:link> and the benefits of OCaml as source language and Hazel as a target language. The stability of OCaml with a powerful type-system makes it very expressive.</html:p>
                <html:p>Hazel, on the other hand, is a hotbed of PL theory research. The typed holes, which are fully supported within the language, are particular powerful targets for a transpiler. They allow transpiler developers to incrementally support the language whilst still getting full feedback of their generated source code. Whilst it is a niche use-case, I thought it was an interesting point to note.</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>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="A second year report">A second year report</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I wrote my second year report at the end of June. The process was a bit chaotic, but I think ultimately it was useful for clarifying some ideas I had rattling about in my head.</html:p>
                <html:p>Part of that was working on my <fr:link href="/publications/" title="Publications" uri="https://patrick.sirref.org/publications/" display-uri="publications" type="local">publications</fr:link> page and, through a conversation with <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://patrick.sirref.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil</fr:link>, realising that my work on <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> was in many ways a part of my own research.</html:p>
                <html:p>If you are interested, feel free to peruse both my <fr:link href="/bafkrmigsvxp4qr3tltethz6oznlgxkkx2dwjjkovjvhemi3k3ljpcydvu4.pdf" type="external">first year</fr:link> and <fr:link href="/bafkrmifhsh5b6mgzdomyfz6harcm2hrzxzxtupije7mqjiwxotupmz4bgy.pdf" type="external">second year</fr:link> reports. Take them with a pinch of salt! I think it is useful to be fairly open with this sort of thing when you can be. Maybe someone will find them useful.</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>6</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:title text="What is scientific programming?">What is <html:em>scientific programming</html:em>?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>This question arose whilst writing my second year report. It got me thinking about how we distinguish scientific programming from other kinds of programming. I came across a paper by Tim Storer: <fr:link href="/storer2017bridging/" title="Bridging the chasm: A survey of software engineering practice in scientific programming" uri="https://patrick.sirref.org/storer2017bridging/" display-uri="storer2017bridging" type="local">Bridiging the chasm: A survey of Software Engineering Practice in Scientific Programming</fr:link>. I enjoyed a few aspects of this paper.</html:p>
                    <html:ul>
                      <html:li>
                        <html:p>Relating scientific programming to the scientific method so directly was pretty useful insight for me. <html:em>Falsifable hypotheses</html:em>, <html:em>repeatable experiments</html:em> and <html:em>reproducible results</html:em> when applied as characteristics of the computer stack (e.g. OS, programming language, filesystem etc.) might be a useful lens to argue for better tools to enable this.</html:p>
                      </html:li>
                      <html:li>
                        <html:p>The breadth of Storer's case-study analysis on how scientific programming has "gone wrong" is very good, if anyone needs a reference to draw on to help support their tools or research, this seems like a good index to use.</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>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="Ppxlib">Ppxlib</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I was reminded again of the pain of helping maintain <fr:link href="/ppxlib/" title="Ppxlib" uri="https://patrick.sirref.org/ppxlib/" display-uri="ppxlib" type="local">ppxlib</fr:link>. We are coming to the conclusion, that in its current form, it is becoming unmaintainable. I took a stab at updating <fr:link href="https://github.com/aantron/bisect_ppx/pull/448" type="external">bisect_ppx</fr:link> to the latest ppxlib. With OCaml entering a potentially turbulent parsetree era, it might be time to take stock of this and propose some fillers to help. Nathan Rebours and I are meeting next week to discuss ideas he has to make parsetree migrations smooth sailing for all!</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>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:title text="Geocaml">Geocaml</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Work on <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> has stalled, which is totally fine. <fr:link href="/mdales/" title="Michael W. Dales" uri="https://patrick.sirref.org/mdales/" display-uri="mdales" type="local">Michael</fr:link> and I independently are working on other things and have obligations to fulfill. Maybe some day we'll carve out enough time together to push forward on this project, but not this week.</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>2025</fr:year>
              <fr:month>6</fr:month>
              <fr:day>2</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/weekly-2025-06-02/</fr:uri>
            <fr:display-uri>weekly-2025-06-02</fr:display-uri>
            <fr:route>/weekly-2025-06-02/</fr:route>
            <fr:title text="Forester as a Target Syntax">Forester as a Target Syntax</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>This week included some time finishing <fr:link href="/open-trace/" title="Opentrace" uri="https://patrick.sirref.org/open-trace/" display-uri="open-trace" type="local">opentrace</fr:link> and subsequently folding it into <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shelter</fr:link>. I have been writing up some more of the draft paper for <fr:link href="/shelter/" title="Shelter" uri="https://patrick.sirref.org/shelter/" display-uri="shelter" type="local">shelter</fr:link> which I am excited to share in the near future.</html:p>
            <html:p>I revisited the <fr:link href="/vpnkit-upgrade/" title="Defunctorising VPNKit" uri="https://patrick.sirref.org/vpnkit-upgrade/" display-uri="vpnkit-upgrade" type="local">upgrading vpnkit</fr:link> PR and pushed some more fixes. I have been thinking, again, about the promise of a direct-style world for OCaml that just hasn't quite landed yet. <html:em>C'est la vie</html:em>.</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>6</fr:month>
                  <fr:day>2</fr:day>
                </fr:date>
                <fr:title text="Forester and Graft">Forester and Graft</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I spent a bit of time finally pulling out my changes to <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> to add markdown and bibtex support into a standalone tool: <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</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>2025</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:uri>https://patrick.sirref.org/graft/</fr:uri>
                    <fr:display-uri>graft</fr:display-uri>
                    <fr:route>/graft/</fr:route>
                    <fr:title text="Graft">Graft</fr:title>
                    <fr:meta name="external">https://github.com/patricoferris/graft</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Graft is a <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> preprocessor.</html:p>
                    <html:p>It takes a forester (a directory of trees) written in a mixture of Markdown, Bibtex and <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax and produces a new forest completely written in <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> syntax.</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>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Usage">Usage</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:code>graft</html:code> simply preprocesses a forest generating Forester trees from <html:code>.md</html:code>, <html:code>.bib</html:code> and <html:code>.tree</html:code> files. It will copy the structure of the input directory in the output directory.</html:p>
                        <html:pre class="hilite">
                          <html:code>
                            <html:span class="sh-source">$ graft preprocess --output=grafted-trees trees
</html:span>
                            <html:span class="sh-source">$ forester build
</html:span>
                          </html:code>
                        </html:pre>
                        <html:p>This assumes that you have updated your Forester <html:code>toml</html:code> file to put the <html:code>grafted-trees</html:code> directory as your source of trees.</html:p>
                        <html:pre><![CDATA[[forest]
trees = [ "grafted-trees" ]]]></html:pre>
                      </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>2025</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Example">Example</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A typical "tree" might look something like</html:p>
                        <html:pre><![CDATA[---
title: Opentrace and Supervisions
date: 2025-05-26
author: Patrick Ferris
---

Over the past two weeks I have mainly split my time (amongst many things) developing [opentrace](open-trace)
and doing revision supervisions.

```forester
\put\transclude/numbered{false}
\transclude{open-trace}
```]]></html:pre>
                        <html:p>A few things to note:</html:p>
                        <html:ol>
                          <html:li>
                            <html:p>The <html:code>yaml</html:code> frontmatter allows you to add some of the metadata fields from Forester.</html:p>
                          </html:li>
                          <html:li>
                            <html:p>At any point in your markdown there is an escape hatch to Forester using a <html:code>forester</html:code> codeblock.</html:p>
                          </html:li>
                        </html:ol>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>It is very satisfying to find the separation of concerns works quite well. For a while I had been rebasing my development branch on <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link>. I was also worried about trying to get the code upstream as it pulled in many dependencies. It seems that I have a very workable solution. I welcome contributions to <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> including extra input formats. I am also considering extending the <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link> configuration to contain some <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> configuration for how it should generate new trees (e.g. at the moment every entry in a bibtex file is given a new tree).</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>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Maths Support">Maths Support</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>As part of that process, <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">graft</fr:link> now supports Markdown KaTeX. For example:</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:uri>https://patrick.sirref.org/mrdts/</fr:uri>
                        <fr:display-uri>mrdts</fr:display-uri>
                        <fr:route>/mrdts/</fr:route>
                        <fr:title text="Mergeable Replicated Data Type Implementation">Mergeable Replicated Data Type Implementation</fr:title>
                        <fr:taxon>Definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A <html:strong>mergeable replicated data type (MRDT) implementation</html:strong> for a data type <fr:tex display="inline"><![CDATA[\tau ]]></fr:tex> is a tuple <fr:tex display="inline"><![CDATA[D_{\tau } = (\Sigma , \sigma _{0}, do, merge)]]></fr:tex> where:</html:p>
                        <html:ul>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[\Sigma ]]></fr:tex> is the set of all possible states at a branch,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[\sigma _{0} \in  \Sigma ]]></fr:tex> is the initial state,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[do : Op_{\tau } \times  \Sigma  \times  Timestamp \rightarrow  \Sigma  \times  Val_{\tau }]]></fr:tex> implements every data type operation,</html:p>
                          </html:li>
                          <html:li>
                            <html:p><fr:tex display="inline"><![CDATA[merge : \Sigma  \times  \Sigma  \times  \Sigma  \rightarrow  \Sigma ]]></fr:tex> implements the <html:em>three-way merge strategy</html:em>.</html:p>
                          </html:li>
                        </html:ul>
                        <html:p><fr:link href="/kcrsk-mrdts-2022/" title="Certified mergeable replicated data types" uri="https://patrick.sirref.org/kcrsk-mrdts-2022/" display-uri="kcrsk-mrdts-2022" type="local">Definition 2.1 from "Certified Mergeable Replicated Data Types"</fr:link>.</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>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>2</fr:day>
                </fr:date>
                <fr:title text="Revision Supervisions">Revision Supervisions</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I have been doing revision supervisions for <fr:link href="/discrete-maths/" title="Discrete Mathematics" uri="https://patrick.sirref.org/discrete-maths/" display-uri="discrete-maths" type="local">Discrete Maths</fr:link> and <fr:link href="https://patrick.sirref.org/focs.md" type="external">Foundations of Computer Science</fr:link>. I have also been marking Operating Systems past paper questions for the same group of first years.</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>2025</fr:year>
              <fr:month>12</fr:month>
              <fr:day>9</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/graft-and-bib-update/</fr:uri>
            <fr:display-uri>graft-and-bib-update</fr:display-uri>
            <fr:route>/graft-and-bib-update/</fr:route>
            <fr:title text="OCaml Roundup: November 2025 › Graft and Bib "><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">OCaml Roundup: November 2025</fr:link> › Graft and Bib </fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>I spent some time at the start of the month updating and fixing <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> and <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">Bib</fr:link>.</html:p>
            <html:p>I added <fr:link href="https://graft.sirref.org/named-subtrees" type="external">named subtrees</fr:link> to the markdown syntax. This allows users to create subtrees with headings that are also externally linkable.</html:p>
            <html:p>With some more bug fixing, I hope to release both libraries before the new year!</html:p>
          </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>2025</fr:year>
              <fr:month>11</fr:month>
              <fr:day>10</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/graft-updates/</fr:uri>
            <fr:display-uri>graft-updates</fr:display-uri>
            <fr:route>/graft-updates/</fr:route>
            <fr:title text="Taking stock &amp; Graft updates › Graft Updates "><fr:link href="/weekly-2025-w45/" title="Taking stock &amp; Graft updates" uri="https://patrick.sirref.org/weekly-2025-w45/" display-uri="weekly-2025-w45" type="local">Taking stock &amp; Graft updates</fr:link> › Graft Updates </fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>It would seem that there is a potential <html:em>second</html:em> user of <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link>! A great source of motivation for some tidying and feature implementing. At the end of last week I fixed some little bugs in <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> and (more importantly) allowed <fr:link href="https://graft.sirref.org/named-subtrees" type="external">users to name their subtrees</fr:link>. Upstream <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> also now pins and uses my <fr:link href="/bib/" title="Bib" uri="https://patrick.sirref.org/bib/" display-uri="bib" type="local">Bibtex implementation</fr:link>.</html:p>
          </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>2025</fr:year>
              <fr:month>11</fr:month>
              <fr:day>10</fr:day>
            </fr:date>
            <fr:uri>https://patrick.sirref.org/self-host-love/</fr:uri>
            <fr:display-uri>self-host-love</fr:display-uri>
            <fr:route>/self-host-love/</fr:route>
            <fr:title text="Thoughts on KC's &quot;Foundations for Hacking on OCaml&quot; › Self-host, self-host, self-host "><fr:link href="/thoughts-on-foundations-for-hacking-on-ocaml/" title="Thoughts on KC's &quot;Foundations for Hacking on OCaml&quot;" uri="https://patrick.sirref.org/thoughts-on-foundations-for-hacking-on-ocaml/" display-uri="thoughts-on-foundations-for-hacking-on-ocaml" type="local">Thoughts on KC's "Foundations for Hacking on OCaml"</fr:link> › Self-host, self-host, self-host </fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Self-hosting is another great way to build those skills. My website has had at least five different incarnations at this point. Some highlights include <fr:link href="https://www.gatsbyjs.com/" type="external">when it was completely made with GatsbyJS</fr:link> (when that was the new hottness), <fr:link href="https://github.com/patricoferris/sesame" type="external">when it was a mishmash of OCurrent and Omd</fr:link>, to now, when it is one part <fr:link href="/graft/" title="Graft" uri="https://patrick.sirref.org/graft/" display-uri="graft" type="local">Graft</fr:link> and one part <fr:link href="/forester/" title="Forester" uri="https://patrick.sirref.org/forester/" display-uri="forester" type="local">Forester</fr:link>.</html:p>
            <html:p>Before I had a website, I was also <fr:link href="https://medium.com/@patrickferris17" type="external">blogging on Medium</fr:link> (I won't pretend they were the best blogs ever, but I learnt a lot by writing them). I have since moved past Medium as their values do not align with my own, but it was an important stepping stone.</html:p>
            <html:p>Thanks to <fr:link href="/ryangibb/" title="Ryan Gibb" uri="https://patrick.sirref.org/ryangibb/" display-uri="ryangibb" type="local">Ryan</fr:link>, who is very generous with his time, I now <fr:link href="https://github.com/patricoferris/nixos" type="external">self-host</fr:link> a variety of services using NixOS.</html:p>
          </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/forester/</fr:uri>
            <fr:display-uri>forester</fr:display-uri>
            <fr:route>/forester/</fr:route>
            <fr:title text="Forester">Forester</fr:title>
          </fr:frontmatter>
          <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>
