<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Posts Tagged "static-site" on Alex Leighton's Blog</title>
  <id>https://alexleighton.com/posts/tags/static-site-tag-feed.xml</id>
  <link href="https://alexleighton.com/posts/tags/static-site-tag-feed.xml" rel="self" />
  <link href="https://alexleighton.com/posts/tags/static-site.html" />
  <updated>2026-03-11T13:36:28.055135011Z</updated>
  <author>
    <name>Alex Leighton</name>
    <uri>https://alexleighton.com/</uri>
  </author>
  <icon>https://alexleighton.com/static/icon-dino.png</icon>
  <logo>https://alexleighton.com/static/icon-dino.png</logo>
  
  <entry>
    <title>Changelog: Series Pages</title>
    <id>https://alexleighton.com/posts/2026-02-03-changelog-series-pages.html</id>
    <link href="https://alexleighton.com/posts/2026-02-03-changelog-series-pages.html" />
    <published>2026-02-03T15:00:00Z</published>
    <updated>2026-02-03T15:00:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Series of blog posts now have a dedicated page.</p><p>Published on <span title="2026-02-03T15:00:00Z">2026-02-03</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Series of blog posts now have a dedicated page.</h3><p>Published on <span title="2026-02-03T15:00:00Z">2026-02-03</span><br>Tags: changelog, static-site</p><p>Like tags, which group different blog posts together, series now have dedicated pages where all the constituent blog posts are listed.</p>
<p>The <a href="../../../posts/series/all.html">All Series</a> page lists all series, like the <a href="../../../posts/series/knowledge-bases.html">Knowledge Bases Tool</a> series.</p><p><a href="https://alexleighton.com/posts/2026-02-03-changelog-series-pages.html">Read the post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Year in Review: 2025</title>
    <id>https://alexleighton.com/posts/2025-12-31-year-in-review-2025.html</id>
    <link href="https://alexleighton.com/posts/2025-12-31-year-in-review-2025.html" />
    <published>2026-01-01T06:15:00Z</published>
    <updated>2026-01-01T06:15:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Building and blogging on this site the past year.</p><p>Published on <span title="2026-01-01T06:15:00Z">2026-01-01</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Building and blogging on this site the past year.</h3><p>Published on <span title="2026-01-01T06:15:00Z">2026-01-01</span><br>Tags: article, git, meta, ocaml, static-site</p><p>For 2024's New Year's resolution I decided I'd finally build and publish a personal website. That I'd write up my thoughts on the articles I was reading and post them instead of dumping them on friends 😆. In review, I'm happy to say I succeeded.</p>
<p>I wrote and published 164 blog posts over the past year, not counting this post. September was my most prolific month. I initialized the OCaml project that became the static site generator in late January, writing a <a href="../../../posts/2025-02-02-listening-to-the-resonance-between.html">test post</a> at the beginning of February to work out frontmatter parsing, markdown generation, and my custom templating language. The first "real" post came at the end of June, a few days after I bought the domain name.</p><p>...<br><a href="https://alexleighton.com/posts/2025-12-31-year-in-review-2025.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Changelog: Individual Image Pages</title>
    <id>https://alexleighton.com/posts/2025-12-01-changelog-individual-image-pages.html</id>
    <link href="https://alexleighton.com/posts/2025-12-01-changelog-individual-image-pages.html" />
    <published>2025-12-02T05:45:00Z</published>
    <updated>2025-12-02T05:45:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Images now link to a page featuring the image.</p><p>Published on <span title="2025-12-02T05:45:00Z">2025-12-02</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Images now link to a page featuring the image.</h3><p>Published on <span title="2025-12-02T05:45:00Z">2025-12-02</span><br>Tags: changelog, ocaml, static-site</p><p>I've created individual image pages. Now all images will link to their own image page, which makes it easier to see the alt text and variant images. For example, <a href="../../../img/img_o_01k80xvwggfn1s20cv98d75bee.html">this page for the picture of my dog on Rialto Beach</a>.</p>
<p>Implementing this was pretty straightforward. My static site generator makes a distinction between "normal" pages, ones where the <code>Page</code> structure is constructible solely from the contents of a file (HTML or Markdown body with all the necessary metadata in a <a href="https://jekyllrb.com/docs/front-matter/">YAML frontmatter</a>), and "synthetic" pages, where the <code>Page</code> structure is constructed in OCaml code inside the generator. These image pages are synthetic: the generator constructs one for each image original used on the site, generated alongside other synthetic pages like the tag pages or blog post archive pages.</p><p>...<br><a href="https://alexleighton.com/posts/2025-12-01-changelog-individual-image-pages.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Changelog: Photos Page</title>
    <id>https://alexleighton.com/posts/2025-10-09-changelog-photos-page.html</id>
    <link href="https://alexleighton.com/posts/2025-10-09-changelog-photos-page.html" />
    <published>2025-10-09T14:00:00Z</published>
    <updated>2025-10-09T14:00:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Photography posts are now browseable image-first.</p><p>Published on <span title="2025-10-09T14:00:00Z">2025-10-09</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Photography posts are now browseable image-first.</h3><p>Published on <span title="2025-10-09T14:00:00Z">2025-10-09</span><br>Tags: changelog, photography, static-site</p><p>I've created a <a href="../../../photos.html">Photos</a> page to show off the <a href="../../../posts/tags/photography.html">photography</a>-tagged posts in a gallery format.</p>
<p>It didn't take much coding work to build, just adding on a "thumb" mode to the image builtin. The majority of the work was achievable with pre-existing template builtins:</p>
<pre><code class="language-html">&lt;main&gt;
  &lt;section&gt;
  &lt;h1&gt;Photos&lt;/h1&gt;
  &lt;div class="gallery"&gt;
    {setlist(posts, contains(item.md.tags, photography))/}
    {foreach(posts, post)/}
      {if(post.md.thumbnail)/}
      &lt;a href="{pageurl(post.md.slug)}"&gt;
        {img(post.md.thumbnail, thumb)}
      &lt;/a&gt;
      {/if}
    {/foreach}
    {/setlist}
  &lt;/div&gt;
  &lt;/section&gt;
&lt;/main&gt;
</code></pre><p><a href="https://alexleighton.com/posts/2025-10-09-changelog-photos-page.html">Read the post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Changelog: Images!</title>
    <id>https://alexleighton.com/posts/2025-09-23-changelog-images.html</id>
    <link href="https://alexleighton.com/posts/2025-09-23-changelog-images.html" />
    <published>2025-09-24T03:45:00Z</published>
    <updated>2025-09-24T03:45:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>This site now supports posting images.</p><p>Published on <span title="2025-09-24T03:45:00Z">2025-09-24</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>This site now supports posting images.</h3><p>Published on <span title="2025-09-24T03:45:00Z">2025-09-24</span><br>Tags: changelog, static-site</p><p>I've finally built support for images! It's taken about 2 months to finish implementation — I started during my vacation in early August and have been working on it when I find the time and motivation. I'll write up a larger post detailing the full system later, suffice it to say I'm generating multiple encodings (<a href="https://en.wikipedia.org/wiki/JPEG">JPEG</a>, <a href="https://en.wikipedia.org/wiki/WebP">WEBP</a>, <a href="https://en.wikipedia.org/wiki/AVIF">AVIF</a>) at multiple resolutions (400px, 720px, 1440px) so I can minimize bandwidth usage and enable the user's browser to select the image which fits best (<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/picture"><code>&lt;picture&gt;</code></a>).</p>
<p>To kick things off, here's a picture of my dog Ki at the dog park:</p>
<p><a href="../../../img/img_o_01k5qtv97rfvy9cqtd2vq322jg.html"><img src="https://alexleighton.com/img/img_01k5qtv97red5b4p6jz4djdb0p.jpg" alt="A tri-colored Australian Shepherd dog named Ki sitting on a wooden tree stump, looking directly at the camera with his tongue hanging out in a happy expression. He has a black coat with white chest and paws, and tan/brown markings around his face and legs. The setting is an outdoor area with a blurred background of buildings and trees during golden hour lighting."></img></a></p><p><a href="https://alexleighton.com/posts/2025-09-23-changelog-images.html">Read the post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Creative Work-Life Balance</title>
    <id>https://alexleighton.com/posts/2025-09-14-creative-work-life-balance.html</id>
    <link href="https://alexleighton.com/posts/2025-09-14-creative-work-life-balance.html" />
    <published>2025-09-15T00:20:00Z</published>
    <updated>2025-09-15T00:20:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Finding space for personal creativity.</p><p>Published on <span title="2025-09-15T00:20:00Z">2025-09-15</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Finding space for personal creativity.</h3><p>Published on <span title="2025-09-15T00:20:00Z">2025-09-15</span><br>Tags: amazon, art, commentary, rss, software-eng, static-site</p><p>My count of RSS feeds as of this writing is a whopping 340. A lot of them haven't had an update in a year or more. Some are dead (<em>I should develop a method for cleaning them up</em>). However, one of the benefits of my laziness is sometimes a non-updating feed updates! Like <a href="https://necropoliscomic.tumblr.com/post/794692540241772544/reblogging-this-here-a-lot-of-folks-on-this-and">today's post on Necropolis</a>, a webcomic I haven't seen update since 2020. The author's been busy being a <a href="https://www.imdb.com/name/nm8359408/">professional animator and producer</a>.</p>
<blockquote>
<p><a href="https://jakewyattonline.tumblr.com/post/794690780648390656/a-necropolis-layout-from-last-year-i-still-work"><strong>Jake Wyatt</strong> on 2025-09-14</a>:</p><p>Getting to make cartoons with so many talented people has been a huge, all-consuming privilege. It’s taken me five years on the job just to get my legs under me, just to begin to feel that I know what I’m doing. It’s taken everything I have just to keep my head above water, to get something resembling our crew’s talent and effort and intention onto the screen. For that entire half-decade I have longed to make comics, to write stories for myself, to draw for myself. But there was always something that needed doing.</p>
<p>Recently I’ve realized that denying that part of myself, telling it to wait its turn through one more script revision, one more review, one more retake, one more episode, one more season–it’s taken a toll that I can no longer afford to pay. I don’t think I can keep going unless I take some time to write and draw and explore outside of the studio production system. As we fight through post on the third season of My Adventures With Superman and start writing the first season of Lantern, I’m looking for ways to work and lead that will get me some of that time back–and my teams are really coming through for me.</p></blockquote><p>...<br><a href="https://alexleighton.com/posts/2025-09-14-creative-work-life-balance.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Changelog: Blog Archive</title>
    <id>https://alexleighton.com/posts/2025-09-13-blog-archive.html</id>
    <link href="https://alexleighton.com/posts/2025-09-13-blog-archive.html" />
    <published>2025-09-13T22:15:00Z</published>
    <updated>2025-09-13T22:15:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Posts are now browseable by year and month.</p><p>Published on <span title="2025-09-13T22:15:00Z">2025-09-13</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Posts are now browseable by year and month.</h3><p>Published on <span title="2025-09-13T22:15:00Z">2025-09-13</span><br>Tags: changelog, static-site</p><p>A page breaking down my blog posts by year and then month, to enable easy browsing of the whole archive, is now available: <a href="../../../years.html">Blog Archives</a>.</p>
<p>Now that I've hit over 50 posts, I thought it was time to build an archive scheme that won't just be an infinitely growing page. Pages for each year a post happened are generated, filtered down to contain only the posts from that year, and further grouped by month. In the process, the blog nav has been standardized and put on the <a href="../../../posts/tags/all.html">tags</a> and <a href="../../../search.html">search</a> pages.</p><p><a href="https://alexleighton.com/posts/2025-09-13-blog-archive.html">Read the post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Changelog: Tag Feeds</title>
    <id>https://alexleighton.com/posts/2025-09-07-tag-feeds.html</id>
    <link href="https://alexleighton.com/posts/2025-09-07-tag-feeds.html" />
    <published>2025-09-08T04:15:00Z</published>
    <updated>2025-09-08T04:15:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Significant tags now have RSS feeds.</p><p>Published on <span title="2025-09-08T04:15:00Z">2025-09-08</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Significant tags now have RSS feeds.</h3><p>Published on <span title="2025-09-08T04:15:00Z">2025-09-08</span><br>Tags: changelog, rss, static-site</p><p>You can now subscribe to posts of a specific tag. The existing <a href="../../../feed.xml">"all posts" feed</a> remains, and now there is a feed for every tag that "contains" at least 5 posts. For example:</p>
<ul>
<li><a href="../../../posts/tags/article-tag-feed.xml">Articles</a></li>
<li><a href="../../../posts/tags/listening-to-tag-feed.xml">Music I'm Listening To</a></li>
<li><a href="../../../posts/tags/software-eng-tag-feed.xml">Software Engineering</a></li>
<li><a href="../../../posts/tags/static-site-tag-feed.xml">Static Site Posts</a></li>
</ul>
<p>The tag page (e.g. <a href="../../../posts/tags/static-site.html">static-site</a>) links to the feed on the page, as well as sets the feed meta tag — so you can paste the tag page URL or the tag feed URL into your feed reader of choice.</p><p><a href="https://alexleighton.com/posts/2025-09-07-tag-feeds.html">Read the post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Re: Who&#39;s Afraid of a Hard Page Load?</title>
    <id>https://alexleighton.com/posts/2025-08-25-re-whos-afraid-of-a-hard-page-load.html</id>
    <link href="https://alexleighton.com/posts/2025-08-25-re-whos-afraid-of-a-hard-page-load.html" />
    <published>2025-08-26T04:45:00Z</published>
    <updated>2025-08-26T04:45:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>From personal experience.</p><p>Published on <span title="2025-08-26T04:45:00Z">2025-08-26</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>From personal experience.</h3><p>Published on <span title="2025-08-26T04:45:00Z">2025-08-26</span><br>Tags: commentary, html, static-site</p><blockquote>
<p><a href="https://unplannedobsolescence.com/blog/hard-page-load/"><strong>Alexander Petros on Unplanned Obsolescence</strong> on 2024-07-16</a>:</p><p>Every day I ride the New York City Subway. For my carrier, most of the stops have cell service, and most of the tunnels between stops do not. When I read web pages while riding, I am keenly aware that if I click a link while I don’t have service, not only will the page fail to load, I will probably also lose access to the one I’m currently reading. Everyone who uses a web browser understands this behavior on some level. So I avoid clicking links until I’m at a stop.</p>
<p>I use the subway as an example to highlight that managing unreliable internet is a daily occurrence even in the most urban environments. Naturally, this concern is magnified in rural areas, which is why I'm deeply skeptical of the claim that SPAs somehow benefit people with slow or unstable internet connections.</p></blockquote><p>...<br><a href="https://alexleighton.com/posts/2025-08-25-re-whos-afraid-of-a-hard-page-load.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Building Search for this Site</title>
    <id>https://alexleighton.com/posts/2025-08-09-building-search-for-this-site.html</id>
    <link href="https://alexleighton.com/posts/2025-08-09-building-search-for-this-site.html" />
    <published>2025-08-10T05:10:37Z</published>
    <updated>2025-08-10T05:10:37Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Search on a static site.</p><p>Published on <span title="2025-08-10T05:10:37Z">2025-08-10</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Search on a static site.</h3><p>Published on <span title="2025-08-10T05:10:37Z">2025-08-10</span><br>Tags: article, java, javascript, ocaml, static-site</p><p>I like the idea of having search for my blog, to help readers find anything related to a specific topic, or something they'd read in the past. How do I make something as dynamic as search, but statically generated?</p>
<h2>Requirements</h2>
<ul>
<li><strong>The solution has to be small</strong> — part of my purpose in statically generating the site is to make it fast to download, fast to view. Whatever is chosen needs to maintain that vision.</li>
<li><strong>The solution can't introduce too many dependencies</strong> — I really like OCaml as a language, and I used building my personal site as an excuse to work in it. Introducing non-OCaml dependencies has to be done with care, as I don't want to maintain a Rube Goldberg machine for my website.</li>
</ul><p>...<br><a href="https://alexleighton.com/posts/2025-08-09-building-search-for-this-site.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Syntax Highlighting</title>
    <id>https://alexleighton.com/posts/2025-08-06-syntax-highlighting.html</id>
    <link href="https://alexleighton.com/posts/2025-08-06-syntax-highlighting.html" />
    <published>2025-08-06T13:30:00Z</published>
    <updated>2025-08-06T13:30:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>We're not there yet.</p><p>Published on <span title="2025-08-06T13:30:00Z">2025-08-06</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>We're not there yet.</h3><p>Published on <span title="2025-08-06T13:30:00Z">2025-08-06</span><br>Tags: article, css, html, javascript, static-site</p><p>Unfortunately I spoke too soon when I wrote the <a href="../../../posts/2025-07-18-building-this-site.html">Building this Site</a> post. I had a plan in place to use <a href="https://opam.ocaml.org/packages/hilite/"><code>hilite</code></a>, along with TextMate grammars and themes pulled from <a href="https://shiki.style/">Shiki</a> (which in turn gets its grammars and themes from TextMate/VSCode), but it fell through.</p>
<h2>The Plan</h2>
<p>The plan was to grab lightmode and darkmode themes from Shiki's <a href="https://github.com/shikijs/textmate-grammars-themes/tree/main/packages/tm-themes">trove of themes</a>, stripping out any extraneous styles (a lot of text-editor-specific colors are given) to arrive at two sets of colors for pre-determined class names. Shiki works similarly to <code>hilite</code>: during processing it tags portions of the source code with CSS tags derived from the grammars. All of the <a href="https://github.com/shikijs/textmate-grammars-themes/tree/main/packages/tm-grammars">TextMate grammars</a> employed by Shiki use a consistent naming scheme, ensuring themes always line up with the grammars, resulting in colored text. With a little adjustment of the theme CSS tags to account for any differences between Hilite's and Shiki's tagging, I'd have ahead-of-time syntax highlighting, with as many supported languages as VSCode.</p><p>...<br><a href="https://alexleighton.com/posts/2025-08-06-syntax-highlighting.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Multiple Scripts</title>
    <id>https://alexleighton.com/posts/2025-07-25-multiple-scripts.html</id>
    <link href="https://alexleighton.com/posts/2025-07-25-multiple-scripts.html" />
    <published>2025-07-25T23:06:48Z</published>
    <updated>2025-07-25T23:06:48Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>HTML-Browser quirk.</p><p>Published on <span title="2025-07-25T23:06:48Z">2025-07-25</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>HTML-Browser quirk.</h3><p>Published on <span title="2025-07-25T23:06:48Z">2025-07-25</span><br>Tags: article, html, static-site</p><p>I learned recently that web browsers will execute an HTTP request for each <code>&lt;script&gt;</code> tag they find in the document. I hadn't really thought much about it, assuming a kind of declarative interpretation of HTML, where when multiple <code>&lt;script src="foo.js"&gt;&lt;/script&gt;</code> show up in the document, only one would be requested and executed. Turns out my assumption is wrong and the browser will happily request the same script multiple times. It's not much of an issue in practice, on subsequent page loads the browser will hit its local cache for every script load.</p>
<p>I have a number of "builtins", invokable functions, in the site's templating language. For example, <code>date</code> which parses and calculates date formats:</p><p>...<br><a href="https://alexleighton.com/posts/2025-07-25-multiple-scripts.html">Read the full post →</a></p>]]></content>
  </entry>
  
  <entry>
    <title>Building this Site</title>
    <id>https://alexleighton.com/posts/2025-07-18-building-this-site.html</id>
    <link href="https://alexleighton.com/posts/2025-07-18-building-this-site.html" />
    <published>2025-07-18T16:31:00Z</published>
    <updated>2025-07-18T16:31:00Z</updated>
    <author><name>Alex Leighton</name></author>
    <summary type="html"><![CDATA[<p>Start of a series on building this website.</p><p>Published on <span title="2025-07-18T16:31:00Z">2025-07-18</span></p>]]></summary>
    <content type="html"><![CDATA[<h3>Start of a series on building this website.</h3><p>Published on <span title="2025-07-18T16:31:00Z">2025-07-18</span><br>Tags: article, software-eng, static-site</p><p>This website is created with a hand-rolled <a href="https://en.wikipedia.org/wiki/Static_site_generator">static site generator</a>. In this series I'll talk about some of the infrastructure I've built towards making the website.</p>
<h2>Infrastructure</h2>
<p>My static site generator <code>asite</code>, is primarily programmed in <a href="https://ocaml.org/">OCaml</a>, using <a href="https://dune.build/">Dune</a> and <a href="https://opam.ocaml.org/">OPAM</a> for the build system. The templating language used is custom, as is the majority of steps in the site building process. I do use a number of external packages:</p>
<ul>
<li><a href="https://ocaml.org/p/cmarkit/latest">cmarkit</a> — blog posts are written in markdown, <code>asite</code> uses <code>cmarkit</code> to render the markdown into HTML.</li>
<li><a href="https://ocaml.org/p/hilite/latest">hilite</a> — for code syntax highlighting, though this isn't a complete solution, more on this in future posts.</li>
<li><a href="https://opam.ocaml.org/packages/js_of_ocaml/">js_of_ocaml</a>, <a href="https://opam.ocaml.org/packages/search/">search</a> — used in building the <a href="../../../search.html">search page</a>, more on this in the future.</li>
<li><a href="https://ocaml.org/p/markup/latest">markup</a> — when generating rss, <code>markup</code> is used to parse and process a blog post's HTML into just a teaser, to keep the size of the rss file small.</li>
<li><a href="https://ocaml.org/p/subprocess/latest">subprocess</a> — used to invoke <code>esbuild</code> as a step in the build process, more on this in future posts.</li>
<li><a href="https://ocaml.org/p/yaml/latest">yaml</a> — blog posts and other pages have a <a href="https://jekyllrb.com/docs/front-matter/">YAML frontmatter</a> containing "columns" in the "post database".</li>
<li><a href="https://ocaml.org/p/alcotest/latest">alcotest</a>, <a href="https://ocaml.org/p/cmdliner/latest">cmdliner</a>, <a href="https://ocaml.org/p/logs/latest">logs</a>, <a href="https://ocaml.org/p/re/latest">re</a>, <a href="https://ocaml.org/p/timedesc/latest">timedesc</a>, and <a href="https://ocaml.org/p/yojson/latest">yojson</a> — miscellaneous low level utilities used all over the place.</li>
</ul><p>...<br><a href="https://alexleighton.com/posts/2025-07-18-building-this-site.html">Read the full post →</a></p>]]></content>
  </entry>
  
</feed>
