this repo has no description

feat: configure dune rules for site content with jon-site package

Create a separate jon-site package to build site content via odoc's
documentation stanza. This avoids index.mld basename conflicts with
the root package and enables hierarchical page names via glob_files_rec.

Changes:
- Add site/dune-project defining the jon-site package
- Update site/dune with documentation stanza using glob_files_rec for
blog, notebooks, reference, drafts, and static assets
- Move @children_order tags before headings (required by odoc)
- Fix cross-references from /site/ to /jon-site/ across all .mld files
- Update site/index.mld to use absolute page references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+102 -73
+1 -1
site/blog/2025/03/index.mld
··· 1 + @children_order module-type-of code-block-metadata 1 2 {0 March} 2 3 3 - @children_order module-type-of code-block-metadata 4 4
+1 -1
site/blog/2025/04/index.mld
··· 1 + @children_order ocaml-docs-ci-and-odoc-3 odoc-3 semantic-versioning-is-hard meeting-the-team this-site 1 2 {0 April} 2 3 3 - @children_order ocaml-docs-ci-and-odoc-3 odoc-3 semantic-versioning-is-hard meeting-the-team this-site 4 4
+1 -1
site/blog/2025/04/ocaml-docs-ci-and-odoc-3.mld
··· 10 10 11 11 {1 The challenge of documenting OCaml} 12 12 13 - As I wrote about {{!/site/blog/2025/04/page-"semantic-versioning-is-hard"}recently}, the 13 + As I wrote about {{!/jon-site/blog/2025/04/page-"semantic-versioning-is-hard"}recently}, the 14 14 APIs of OCaml libraries are dependent not only on the version of its package, but possibly 15 15 also on the versions of any of its dependencies. Due to this fact, to produce the docs for 16 16 ocaml.org means that sometimes we need to build the docs for a particular version of a
+1 -1
site/blog/2025/04/this-site.mld
··· 110 110 111 111 As a more extended example of odoc notebooks, I have converted to this format the course that I help teach 112 112 at the University of Cambridge; {{:https://www.cl.cam.ac.uk/teaching/2425/FoundsCS/}Foundations of Computer Science}. 113 - {{!/site/notebooks/foundations/page-index}Try them out for yourself!}. 113 + {{!/jon-site/notebooks/foundations/page-index}Try them out for yourself!}. 114 114 115 115 116 116
+2 -2
site/blog/2025/05/docs-progress.mld
··· 58 58 {1 Step 2: building packages} 59 59 60 60 The next step, once we've got the solutions, is to build the packages. This is using the new method 61 - I {{!/site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}previously wrote about}. There are about 61 + I {{!/jon-site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}previously wrote about}. There are about 62 62 1,000 packages that fail to build, and once again we can take a look and categorise some of these 63 63 failures. There are a wider variety of failures here, and it's quite useful to cross-check with 64 64 {{!https://check.ci.ocaml.org/}opam health check} to see if it's known to be broken. Unfortunately ··· 139 139 unknown package 140 140 v} 141 141 142 - which is happening because of the optimisation I {{!/site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}mentioned before} where we 142 + which is happening because of the optimisation I {{!/jon-site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}mentioned before} where we 143 143 build a new [opam-repository] with only the packages we're going to need. In this case, we've somehow 144 144 missed out the [ctypes] package. Looking at the opam file for [ctypes-foreign], it has a [post] dependency 145 145 on [ctypes]. The [post] keyword indicates that [ctypes] should be installed with [ctypes-foreign], but
+1 -1
site/blog/2025/05/index.mld
··· 1 + @children_order docs-progress lots-of-things ticks-solved-by-ai oxcaml-gets-closer ai-for-climate-and-nature-day 1 2 {0 May} 2 3 3 - @children_order docs-progress lots-of-things ticks-solved-by-ai oxcaml-gets-closer ai-for-climate-and-nature-day 4 4
+2 -2
site/blog/2025/05/lots-of-things.mld
··· 13 13 14 14 I've been working with {{:https://tunbury.org/}Mark Elvers} on getting the docs 15 15 CI running using Odoc 3.0. There are quite a few changes involved, both in how 16 - we're {{!/site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}building the packages} 16 + we're {{!/jon-site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}building the packages} 17 17 but also how we're running odoc - it's building using [odoc_driver] rather than [voodoo] now, 18 18 and while it's looking promising now we had hit a few hurdles along the way. 19 19 ··· 126 126 127 127 The upshot of all this is that I now have a semi-working version of the notebooks using oxcaml. As 128 128 an initial demonstration I ported one of my colleague {{:https://github.com/cuihtlauac}Cuihtlauac}'s 129 - oxcaml tutorial docs to the notebook format, and it {{!/site/notebooks/oxcaml/page-"local"}works quite nicely}. 129 + oxcaml tutorial docs to the notebook format, and it {{!/jon-site/notebooks/oxcaml/page-"local"}works quite nicely}. 130 130 131 131 132 132
+1 -1
site/blog/2025/05/oxcaml-gets-closer.mld
··· 20 20 21 21 Personally, I'm looking forward to seeing their branch of {{:https://ocaml.github.io/odoc/}odoc} and 22 22 having a look to see how the modes will fit into the documentation. I'm also keen to see whether the 23 - {{!/site/blog/2025/04/page-"this-site"}notebook features} I've been working on can be ported over to run on OxCaml! 23 + {{!/jon-site/blog/2025/04/page-"this-site"}notebook features} I've been working on can be ported over to run on OxCaml! 24 24 25 25
+1 -1
site/blog/2025/06/index.mld
··· 1 + @children_order week23 1 2 {0 June} 2 3 3 - @children_order week23 4 4
+1 -1
site/blog/2025/07/index.mld
··· 1 + @children_order retrospective odoc-3-live-on-ocaml-org week28 week27 1 2 {0 July} 2 3 3 - @children_order retrospective odoc-3-live-on-ocaml-org week28 week27 4 4
+1 -1
site/blog/2025/07/odoc-3-live-on-ocaml-org.mld
··· 20 20 during the build process, and so part of the process of building docs is to build the packages, 21 21 so we have to, at minimum, attempt to build all 17,000 or so distinct versions of the packages 22 22 in opam-repository. The {{:https://github.com/ocurrent}ocurrent} tool {{:https://github.com/ocurrent/ocaml-docs-ci}ocaml-docs-ci}, 23 - which I've previously {{!/site/blog/2025/05/page-"docs-progress"}written} {{!/site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}about}, 23 + which I've previously {{!/jon-site/blog/2025/05/page-"docs-progress"}written} {{!/jon-site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}about}, 24 24 is responsible for these builds and in this new release has demonstrated a new approach to this task, 25 25 where we attempt to do the build in as efficient a way as possible by effectively building 26 26 binary packages once for each required package in a specific 'universe' of dependencies. For
+5 -5
site/blog/2025/07/retrospective.mld
··· 22 22 difficult to make the next steps happen. One area where I've had some success is in 23 23 working with Sadiq on LLMs - in particular, getting local LLMs to solve programming 24 24 exercises that we both {{:https://toao.com/blog/ocaml-local-code-models}wrote} 25 - {{!/site/blog/2025/05/page-"ticks-solved-by-ai"}up}. I've also been working with him 25 + {{!/jon-site/blog/2025/05/page-"ticks-solved-by-ai"}up}. I've also been working with him 26 26 on taking the output from the docs CI and {{:https://github.com/sadiqj/odoc-llm}summarising it with LLMs} in order to 27 27 create an MCP server that would help tools like {{:https://anthropic.com/}Claude Code} 28 28 to choose OCaml packages to solve users' problems. 29 29 30 30 It's been somewhat easier, partly due to inertia, to carry on with projects that had been in flight at the time 31 31 I started. Things like getting the Odoc 3 generated docs onto ocaml.org, which is 32 - finally complete only {{!/site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}as of this week!}. 32 + finally complete only {{!/jon-site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}as of this week!}. 33 33 This has taken a whole lot of time, but I'm really pleased with the end results. There's 34 34 still an awful lot of improvements that I'd like to see made, which, after drawing breath for 35 35 a couple of weeks, I'll be writing down. 36 36 37 37 An itch I'd been wanting to scratch for a long time has been to look at client-side ocaml 38 - notebooks. I decided to make this an integral {{!/site/blog/2025/04/page-"this-site"}feature of this blog}, 38 + notebooks. I decided to make this an integral {{!/jon-site/blog/2025/04/page-"this-site"}feature of this blog}, 39 39 and I've learnt an awful 40 40 lot doing it. An important feature of this that I've been keeping in mind is the idea that 41 41 we could use the ocaml-docs-ci tool to build the libraries, which would allow us to host ··· 73 73 74 74 {2 Efficient and reusable CI} 75 75 A clear and obvious area where we'll be able to see real progress is to extract from docs CI the logic that I've been 76 - using to do efficient builds of packages. As I previously {{!/site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}wrote about}, 76 + using to do efficient builds of packages. As I previously {{!/jon-site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}wrote about}, 77 77 the new CI system is far more efficient than some of the other ocurrent-based pipelines, 78 78 and it would save a huge amount of compute time if we were to take this tech and apply it 79 79 elsewhere. ··· 90 90 get this running on a big machine and just see how fast we can build everything. The key thing 91 91 here is that it should be {e trivial} to run this on a linux box. A raspberry pi or a 768-core 92 92 behemoth with 3TiB of ram. Just how fast {e can} we get it going? It's already building in a 93 - couple of days using {{!/site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}sage}, but that's 93 + couple of days using {{!/jon-site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}sage}, but that's 94 94 using ocurrent/obuilder, which isn't quite the right tool for the job, and on a relatively 95 95 puny machine. Can we do it in an hour? 10 minutes? Certainly the incrememntal builds ought 96 96 to be done in seconds. What's the limit?
+1 -1
site/blog/2025/08/index.mld
··· 1 + @children_order ocaml-lsp-mcp ocaml-mcp-server week33 1 2 {0 August} 2 3 3 - @children_order ocaml-lsp-mcp ocaml-mcp-server week33 4 4
+1 -1
site/blog/2025/08/week33.mld
··· 28 28 experience. 29 29 30 30 Thirdly, and most importantly, we had decided that we needed a few example searches to show 31 - how the system worked. We'd already had a {{!/site/blog/2025/07/page-week28}useful experience} 31 + how the system worked. We'd already had a {{!/jon-site/blog/2025/07/page-week28}useful experience} 32 32 with this when Anil had tried to search for a 'time and date parsing and formatting' library, 33 33 so it shouldn't really have been a surprise that trying a few more examples showed some more 34 34 interesting behaviour. Specifically, the searches I wanted to do were for an "HTTP client", "JSON parser",
+1 -1
site/blog/2025/09/caching-opam-solutions.mld
··· 5 5 The {{:https://github.com/ocurrent/ocaml-docs-ci}ocaml-docs-ci} system works by watching 6 6 opam-repository for changes, and then when it notices a new package it performs an opam 7 7 solve and builds the package, a prerequisite for building the documentation. In order 8 - to give the docs some stability, as the docs may well {{!/site/blog/2025/04/page-"semantic-versioning-is-hard"}depend upon your dependencies}, we currently cache the solve results so that a package 8 + to give the docs some stability, as the docs may well {{!/jon-site/blog/2025/04/page-"semantic-versioning-is-hard"}depend upon your dependencies}, we currently cache the solve results so that a package 9 9 will always be built with the same set of dependencies, even if a new version of one 10 10 of those dependencies has been released. 11 11
+1 -1
site/blog/2025/09/caching-opam-solutions2.mld
··· 2 2 3 3 @published 2025-09-23 4 4 5 - Some results from the {{!/site/blog/2025/09/page-"caching-opam-solutions"}previous post}. 5 + Some results from the {{!/jon-site/blog/2025/09/page-"caching-opam-solutions"}previous post}. 6 6 This time I've run day10 on 144 or so commits from opam-repository to see how well the 7 7 cache performs. The results are quite interesting. 8 8
+1 -1
site/blog/2025/09/index.mld
··· 1 + @children_order caching-opam-solutions2 odoc-bugs caching-opam-solutions build-ids-for-day10 giving-hub-cl-an-upgrade 1 2 {0 September} 2 3 3 - @children_order caching-opam-solutions2 odoc-bugs caching-opam-solutions build-ids-for-day10 giving-hub-cl-an-upgrade 4 4
+1 -1
site/blog/2025/11/index.mld
··· 1 + @children_order foundations-of-computer-science 1 2 {0 November} 2 3 3 - @children_order foundations-of-computer-science 4 4
+2 -2
site/blog/2025/12/an-svg-is-all-you-need.mld
··· 54 54 So this is yet another tool in our ongoing effort to be able to effortlessly share and 55 55 remix our work - added to the pile of Jupyter notebooks, {{:https://digitalflapjack.com/blog/marimo/}Marimo botebooks}, 56 56 the {{:https://slipshow.readthedocs.io/en/stable/}slipshow}/{{:https://github.com/art-w/x-ocaml/}x-ocaml} 57 - {{!/site/blog/2025/11/page-"foundations-of-computer-science"}combination}, 57 + {{!/jon-site/blog/2025/11/page-"foundations-of-computer-science"}combination}, 58 58 {{:https://patrick.sirref.org/weekly-2025-w45/index.xml}Patrick's take} on Jon Sterling's 59 - {{:https://sr.ht/~jonsterling/forester/}Forester}, my own {{!/site/notebooks/page-index}notebooks}, 59 + {{:https://sr.ht/~jonsterling/forester/}Forester}, my own {{!/jon-site/notebooks/page-index}notebooks}, 60 60 and many others - and this is a subset of what we're using just in our own group! 61 61 62 62
+1 -1
site/blog/2025/12/claude-and-dune.mld
··· 6 6 major new version of the OCaml documentation generator. It had a whole load of {{:https://discuss.ocaml.org/t/ann-odoc-3-beta-release/16043}new features}, 7 7 many of which came with new demands on the build system driving it. We decided when 8 8 working on it to build a new driver for odoc so that we could adjust it as we were 9 - building the new features, and this driver is now used to {{!/site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}build the documentation} that appears on 9 + building the new features, and this driver is now used to {{!/jon-site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}build the documentation} that appears on 10 10 {{:https://ocaml.org/p/base/latest/doc/index.html}ocaml.org}. However, it was 11 11 always the plan to integrate the new features into {{:https://dune.build}Dune} so 12 12 that everyone could just run [dune build @doc] and be able to use all of the new
+1 -1
site/blog/2025/12/index.mld
··· 1 + @children_order claude-and-dune an-svg-is-all-you-need 1 2 {0 December} 2 3 3 - @children_order claude-and-dune an-svg-is-all-you-need 4 4
+29 -29
site/blog/2025/index.mld
··· 1 + @children_order 12 11 09 08 07 06 05 04 03 1 2 {0 2025} 2 3 3 - @children_order 12/ 11/ 09/ 08/ 07/ 06/ 05/ 04/ 03/ 4 4 5 - - {{!/site/blog/2025/12/page-"claude-and-dune"}Claude and Dune} 6 - - {{!/site/blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need} 7 - - {{!/site/blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science} 8 - - {{!/site/blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 9 - - {{!/site/blog/2025/09/page-"odoc-bugs"}Odoc bugs} 10 - - {{!/site/blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 11 - - {{!/site/blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 12 - - {{!/site/blog/2025/09/page-"giving-hub-cl-an-upgrade"}Giving hub.cl an upgrade} 13 - - {{!/site/blog/2025/08/page-"ocaml-lsp-mcp"}Using ocaml-lsp-server via an MCP server} 14 - - {{!/site/blog/2025/08/page-"ocaml-mcp-server"}An OCaml MCP server} 15 - - {{!/site/blog/2025/08/page-week33}Week 33} 16 - - {{!/site/blog/2025/07/page-retrospective}4 months in, a retrospective} 17 - - {{!/site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}Odoc 3 is live on OCaml.org!} 18 - - {{!/site/blog/2025/07/page-week28}Week 28} 19 - - {{!/site/blog/2025/07/page-week27}Weeks 24-27} 20 - - {{!/site/blog/2025/06/page-week23}Week 23} 21 - - {{!/site/blog/2025/05/page-"docs-progress"}Progress in OCaml docs} 22 - - {{!/site/blog/2025/05/page-"lots-of-things"}Lots of things have been happening} 23 - - {{!/site/blog/2025/05/page-"ticks-solved-by-ai"}Solving First-year OCaml exercises with AI} 24 - - {{!/site/blog/2025/05/page-"oxcaml-gets-closer"}OxCaml is getting closer...} 25 - - {{!/site/blog/2025/05/page-"ai-for-climate-and-nature-day"}AI for Climate & Nature Community Day} 26 - - {{!/site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}OCaml-Docs-CI and Odoc 3} 27 - - {{!/site/blog/2025/04/page-"odoc-3"}Odoc 3: So what?} 28 - - {{!/site/blog/2025/04/page-"semantic-versioning-is-hard"}Semantic Versioning in OCaml is Hard} 29 - - {{!/site/blog/2025/04/page-"meeting-the-team"}Meeting the Team} 30 - - {{!/site/blog/2025/04/page-"this-site"}This site} 31 - - {{!/site/blog/2025/03/page-"module-type-of"}The Road to Odoc 3: Module Type Of} 32 - - {{!/site/blog/2025/03/page-"code-block-metadata"}Code block metadata} 5 + - {{!/jon-site/blog/2025/12/page-"claude-and-dune"}Claude and Dune} 6 + - {{!/jon-site/blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need} 7 + - {{!/jon-site/blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science} 8 + - {{!/jon-site/blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 9 + - {{!/jon-site/blog/2025/09/page-"odoc-bugs"}Odoc bugs} 10 + - {{!/jon-site/blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 11 + - {{!/jon-site/blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 12 + - {{!/jon-site/blog/2025/09/page-"giving-hub-cl-an-upgrade"}Giving hub.cl an upgrade} 13 + - {{!/jon-site/blog/2025/08/page-"ocaml-lsp-mcp"}Using ocaml-lsp-server via an MCP server} 14 + - {{!/jon-site/blog/2025/08/page-"ocaml-mcp-server"}An OCaml MCP server} 15 + - {{!/jon-site/blog/2025/08/page-week33}Week 33} 16 + - {{!/jon-site/blog/2025/07/page-retrospective}4 months in, a retrospective} 17 + - {{!/jon-site/blog/2025/07/page-"odoc-3-live-on-ocaml-org"}Odoc 3 is live on OCaml.org!} 18 + - {{!/jon-site/blog/2025/07/page-week28}Week 28} 19 + - {{!/jon-site/blog/2025/07/page-week27}Weeks 24-27} 20 + - {{!/jon-site/blog/2025/06/page-week23}Week 23} 21 + - {{!/jon-site/blog/2025/05/page-"docs-progress"}Progress in OCaml docs} 22 + - {{!/jon-site/blog/2025/05/page-"lots-of-things"}Lots of things have been happening} 23 + - {{!/jon-site/blog/2025/05/page-"ticks-solved-by-ai"}Solving First-year OCaml exercises with AI} 24 + - {{!/jon-site/blog/2025/05/page-"oxcaml-gets-closer"}OxCaml is getting closer...} 25 + - {{!/jon-site/blog/2025/05/page-"ai-for-climate-and-nature-day"}AI for Climate & Nature Community Day} 26 + - {{!/jon-site/blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}OCaml-Docs-CI and Odoc 3} 27 + - {{!/jon-site/blog/2025/04/page-"odoc-3"}Odoc 3: So what?} 28 + - {{!/jon-site/blog/2025/04/page-"semantic-versioning-is-hard"}Semantic Versioning in OCaml is Hard} 29 + - {{!/jon-site/blog/2025/04/page-"meeting-the-team"}Meeting the Team} 30 + - {{!/jon-site/blog/2025/04/page-"this-site"}This site} 31 + - {{!/jon-site/blog/2025/03/page-"module-type-of"}The Road to Odoc 3: Module Type Of} 32 + - {{!/jon-site/blog/2025/03/page-"code-block-metadata"}Code block metadata}
+1 -1
site/blog/2026/01/index.mld
··· 1 + @children_order weeknotes-2026-04-05 weeknotes-2026-03 1 2 {0 January} 2 3 3 - @children_order weeknotes-2026-04-05 weeknotes-2026-03 4 4
+1 -1
site/blog/2026/01/weeknotes-2026-03.mld
··· 76 76 test this out. 77 77 78 78 {2 Day10 and docs} 79 - I've {{!/site/blog/2025/09/page-"build-ids-for-day10"}written about} {{:https://tunbury.org/}Mark's} day10 project 79 + I've {{!/jon-site/blog/2025/09/page-"build-ids-for-day10"}written about} {{:https://tunbury.org/}Mark's} day10 project 80 80 before. It's a tool to very rapidly build odoc packages mainly in order to test that they build correctly. An obvious 81 81 extension would be to use this to then build the docs for those packages, as the way we do this requires the packages 82 82 to be built first. This would be a replacement for the Docs CI that I talked about above, though there's considerable
+2 -2
site/blog/2026/01/weeknotes-2026-04-05.mld
··· 37 37 the expansions and referencing correct, and while we've made progress on the actual content markup, introducing 38 38 {{:https://ocaml.github.io/odoc/odoc/odoc_for_authors.html#media}media tags} for example, there's still a good distance to go. 39 39 40 - Using the plugins mechanism I {{!/site/blog/2026/01/page-"weeknotes-2026-03"}wrote about last week}, 40 + Using the plugins mechanism I {{!/jon-site/blog/2026/01/page-"weeknotes-2026-03"}wrote about last week}, 41 41 I've made a plugin interface for odoc and implemented a few plugins. Initially I was just going to support 'custom tags' 42 42 but it occurred to me that rendering code blocks could also be done in this way. So I've made a few. Two custom tag plugins: 43 43 ··· 60 60 61 61 {{:https://github.com/lukemaurer}Luke Maurer} at Jane Street pointed out that they're still suffering from 62 62 yet another repro of {{:https://github.com/ocaml/odoc/issues/930}issue 930} at Jane Street. I'd worked on this 63 - {{!/site/blog/2025/09/page-"odoc-bugs"}back in September} but turns out I hadn't actually made a PR, so I tidied 63 + {{!/jon-site/blog/2025/09/page-"odoc-bugs"}back in September} but turns out I hadn't actually made a PR, so I tidied 64 64 up the branch and {{:https://github.com/ocaml/odoc/pull/1400}made a PR}. 65 65 66 66 {2 Docs CI}
+1 -1
site/blog/2026/02/index.mld
··· 1 + @children_order weeknotes-2026-06 1 2 {0 February} 2 3 3 - @children_order weeknotes-2026-06 4 4
+4 -4
site/blog/2026/index.mld
··· 1 + @children_order 02/ 01/ 1 2 {0 2026} 2 3 3 - @children_order 02/ 01/ 4 4 5 - - {{!/site/blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6} 6 - - {{!/site/blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 7 - - {{!/site/blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3} 5 + - {{!/jon-site/blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6} 6 + - {{!/jon-site/blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 7 + - {{!/jon-site/blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3}
+1 -1
site/blog/index.mld
··· 1 + @children_order 2026 2025 1 2 {0 Blog} 2 3 3 - @children_order 2026/ 2025/ 4 4 5 5 Use the sidebar to navigate the blog posts. The most recent posts are listed first.
+24 -1
site/dune
··· 1 + ; Site content for jon.recoil.org 2 + ; 3 + ; Uses (files ...) with glob_files_rec to include .mld files from 4 + ; subdirectories. Each file's relative path becomes its hierarchical 5 + ; page name in odoc (e.g., blog/2025/03/code-block-metadata). 6 + ; 7 + ; The root-level .mld files (index.mld) are picked up automatically 8 + ; by the (documentation) stanza's standard mld_files discovery. 9 + ; 10 + ; Shell configuration: 11 + ; The site should use --shell jon-shell for HTML generation. 12 + ; Currently, dune's html_flags are resolved globally (from the context 13 + ; build dir), so per-package shell differentiation is not possible 14 + ; within a single `dune build @doc` invocation. The deploy script 15 + ; handles this by setting html_flags in dune-workspace before building. 16 + ; See deploy-site.sh for details. 17 + 1 18 (documentation 2 - (package root)) 19 + (package jon-site) 20 + (files 21 + (glob_files_rec blog/*.mld) 22 + (glob_files_rec notebooks/*.mld) 23 + (glob_files_rec reference/*.mld) 24 + (glob_files_rec drafts/*.mld) 25 + (glob_files_rec static/assets/*.jpg)))
+7
site/dune-project
··· 1 + (lang dune 3.20) 2 + (name jon-site) 3 + 4 + (package 5 + (name jon-site) 6 + (synopsis "Content for jon.recoil.org") 7 + (allow_empty))
+2 -3
site/index.mld
··· 5 5 {1 Sections} 6 6 7 7 {ul 8 - {- {{!page-blog}Blog}} 9 - {- {{!page-notebooks}Notebooks}} 10 - {- {{!page-projects}Projects}} 8 + {- {{!/jon-site/blog/page-index}Blog}} 9 + {- {{!/jon-site/notebooks/page-index}Notebooks}} 11 10 }
+2 -2
site/notebooks/foundations/index.mld
··· 1 + @children_order foundations1 foundations2 foundations3 foundations4 foundations5 foundations6 foundations7 foundations8 foundations9 foundations10 foundations11 1 2 {0 Foundations of Computer Science} 2 3 3 - @children_order foundations1 foundations2 foundations3 foundations4 foundations5 foundations6 foundations7 foundations8 foundations9 foundations10 foundations11 4 4 5 5 {1 Introduction} 6 6 These are a series of odoc notebooks created from the lecture notes of the 1A course ··· 17 17 by Jeremy Yallop. We thank Richard Sharp, Srinivasan Keshav, Ambroise Lafont, Vojtěch Tvrdík 18 18 and Jeremy Yallop for further feedback and corrections since 2020. 19 19 20 - {!/site/notebooks/foundations/page-foundations1} 20 + {!/jon-site/notebooks/foundations/page-foundations1} 21 21