My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

site-builder: generate explicit odoc dune rules for the site

Replace the (documentation ...) stanza in site/dune with explicit
odoc compile → link → html-generate rules generated by a small OCaml
tool (site-builder/gen_rules.exe).

The generator walks site/ finding .mld files and static assets, then
emits two directory-target rules (compile+link → _odoc/, html-generate
+ support-files + assets → _html/) and a top-level @site alias.

Build the site with: dune build @site
Output lands in: _build/default/site/_html/

The committed site/dune.inc is kept in sync via dune build @runtest
(diff check against the generated output).

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

+1864 -31
+2
dune-project
··· 1 1 (lang dune 3.20) 2 2 (name root) 3 3 4 + (using directory-targets 0.1) 5 + 4 6 (generate_opam_files true) 5 7 6 8 (package
+3
site-builder/dune
··· 1 + (executable 2 + (name gen_rules) 3 + (libraries unix))
+150
site-builder/gen_rules.ml
··· 1 + (* gen_rules.ml — Generate dune rules for the site's odoc pipeline. 2 + 3 + Walks the current directory finding .mld files and static assets, 4 + then emits dune rules for two phases: 5 + 6 + Phase 1: compile + link → (dir _odoc) 7 + Phase 2: html-generate + support-files + asset copy → (dir _html) 8 + 9 + Uses directory targets because dune requires rule targets to be in 10 + the current directory. This means any .mld change triggers a full 11 + rebuild, but for ~60 pages the pipeline is fast enough. *) 12 + 13 + let package = "jon-site" 14 + 15 + let excluded_dirs = 16 + [ 17 + "vendor"; 18 + "site-builder"; 19 + "scripts"; 20 + "_build"; 21 + "_odoc"; 22 + "_html"; 23 + "_opam"; 24 + "_tmp"; 25 + ] 26 + 27 + let is_excluded name = 28 + (String.length name > 0 && name.[0] = '.') 29 + || (String.length name > 0 && name.[0] = '_') 30 + || List.mem name excluded_dirs 31 + 32 + (* Walk a directory tree, collecting files that match [pred]. 33 + Results are sorted for deterministic output. *) 34 + let walk_files ~pred root = 35 + let acc = ref [] in 36 + let rec go dir = 37 + let entries = Sys.readdir dir in 38 + Array.sort String.compare entries; 39 + Array.iter 40 + (fun entry -> 41 + let path = Filename.concat dir entry in 42 + if Sys.is_directory path then begin 43 + if not (is_excluded entry) then go path 44 + end 45 + else if pred entry then acc := path :: !acc) 46 + entries 47 + in 48 + go root; 49 + List.rev !acc 50 + 51 + let strip_dot_slash s = 52 + if String.length s >= 2 && s.[0] = '.' && s.[1] = '/' then 53 + String.sub s 2 (String.length s - 2) 54 + else s 55 + 56 + (* --- Path computations -------------------------------------------------- *) 57 + 58 + let parent_id rel = 59 + let dir = Filename.dirname rel in 60 + if dir = "." then package else Printf.sprintf "%s/%s" package dir 61 + 62 + let page_name rel = 63 + Printf.sprintf "page-%s" (Filename.chop_extension (Filename.basename rel)) 64 + 65 + let odoc_target rel = 66 + let dir = Filename.dirname rel in 67 + let pn = page_name rel in 68 + if dir = "." then Printf.sprintf "_odoc/%s/%s.odoc" package pn 69 + else Printf.sprintf "_odoc/%s/%s/%s.odoc" package dir pn 70 + 71 + let odocl_target rel = Filename.chop_extension (odoc_target rel) ^ ".odocl" 72 + 73 + let html_target rel = 74 + let dir = Filename.dirname rel in 75 + let base = Filename.chop_extension (Filename.basename rel) in 76 + if dir = "." then Printf.sprintf "_html/%s/%s.html" package base 77 + else Printf.sprintf "_html/%s/%s/%s.html" package dir base 78 + 79 + (* --- Output helpers ------------------------------------------------------ *) 80 + 81 + let pr = Printf.printf 82 + let prl fmt = Printf.printf (fmt ^^ "\n") 83 + 84 + (* --- Main ---------------------------------------------------------------- *) 85 + 86 + let () = 87 + let mld_files = 88 + walk_files ~pred:(fun f -> Filename.check_suffix f ".mld") "." 89 + |> List.map strip_dot_slash 90 + in 91 + let assets = 92 + if Sys.file_exists "static" && Sys.is_directory "static" then 93 + walk_files ~pred:(fun _ -> true) "static" |> List.map strip_dot_slash 94 + else [] 95 + in 96 + (* Phase 1: compile all .mld → .odoc, then link all .odoc → .odocl *) 97 + prl "(rule"; 98 + prl " (target (dir _odoc))"; 99 + prl " (deps"; 100 + List.iter (fun rel -> prl " %s" rel) mld_files; 101 + prl " )"; 102 + prl " (action"; 103 + prl " (progn"; 104 + (* Compile *) 105 + List.iter 106 + (fun rel -> 107 + prl " (run odoc compile %s --output-dir _odoc --parent-id %s)" rel 108 + (parent_id rel)) 109 + mld_files; 110 + (* Link *) 111 + List.iter 112 + (fun rel -> 113 + prl " (run odoc link %s -P %s:_odoc/%s -o %s)" (odoc_target rel) 114 + package package (odocl_target rel)) 115 + mld_files; 116 + prl " )))"; 117 + pr "\n"; 118 + (* Phase 2: html-generate + support-files + asset copy *) 119 + prl "(rule"; 120 + prl " (target (dir _html))"; 121 + prl " (deps"; 122 + List.iter (fun rel -> prl " %s" (odocl_target rel)) mld_files; 123 + List.iter (fun asset -> prl " %s" asset) assets; 124 + prl " )"; 125 + prl " (action"; 126 + prl " (progn"; 127 + (* HTML generate *) 128 + List.iter 129 + (fun rel -> 130 + prl " (run odoc html-generate --shell jon-shell -o _html %s)" 131 + (odocl_target rel)) 132 + mld_files; 133 + (* Support files *) 134 + prl " (run odoc support-files -o _html)"; 135 + (* Asset copies — use system because (copy) declares implicit targets *) 136 + List.iter 137 + (fun asset -> 138 + prl " (system \"mkdir -p $(dirname _html/%s/%s) && cp %s _html/%s/%s\")" 139 + package asset asset package asset) 140 + assets; 141 + prl " )))"; 142 + pr "\n"; 143 + (* @site alias *) 144 + prl "(alias"; 145 + prl " (name site)"; 146 + prl " (deps"; 147 + List.iter (fun rel -> prl " %s" (html_target rel)) mld_files; 148 + List.iter (fun asset -> prl " _html/%s/%s" package asset) assets; 149 + prl " ))"; 150 + ()
+20 -24
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. 1 + (include dune.inc) 17 2 18 - (documentation 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))) 3 + (rule 4 + (deps 5 + (glob_files_rec *.mld) 6 + (glob_files_rec static/*)) 7 + (action 8 + (with-stdout-to 9 + dune.inc.gen.raw 10 + (run ../site-builder/gen_rules.exe)))) 11 + 12 + (rule 13 + (action 14 + (with-stdout-to 15 + dune.inc.gen 16 + (run dune format-dune-file %{dep:dune.inc.gen.raw})))) 17 + 18 + (rule 19 + (alias runtest) 20 + (action 21 + (diff dune.inc dune.inc.gen)))
-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))
+1689
site/dune.inc
··· 1 + (rule 2 + (target 3 + (dir _odoc)) 4 + (deps 5 + blog/2025/03/code-block-metadata.mld 6 + blog/2025/03/index.mld 7 + blog/2025/03/module-type-of.mld 8 + blog/2025/04/index.mld 9 + blog/2025/04/meeting-the-team.mld 10 + blog/2025/04/ocaml-docs-ci-and-odoc-3.mld 11 + blog/2025/04/odoc-3.mld 12 + blog/2025/04/semantic-versioning-is-hard.mld 13 + blog/2025/04/this-site.mld 14 + blog/2025/05/ai-for-climate-and-nature-day.mld 15 + blog/2025/05/docs-progress.mld 16 + blog/2025/05/index.mld 17 + blog/2025/05/lots-of-things.mld 18 + blog/2025/05/oxcaml-gets-closer.mld 19 + blog/2025/05/ticks-solved-by-ai.mld 20 + blog/2025/06/index.mld 21 + blog/2025/06/week23.mld 22 + blog/2025/07/index.mld 23 + blog/2025/07/odoc-3-live-on-ocaml-org.mld 24 + blog/2025/07/retrospective.mld 25 + blog/2025/07/week27.mld 26 + blog/2025/07/week28.mld 27 + blog/2025/08/index.mld 28 + blog/2025/08/ocaml-lsp-mcp.mld 29 + blog/2025/08/ocaml-mcp-server.mld 30 + blog/2025/08/week33.mld 31 + blog/2025/09/build-ids-for-day10.mld 32 + blog/2025/09/caching-opam-solutions.mld 33 + blog/2025/09/caching-opam-solutions2.mld 34 + blog/2025/09/giving-hub-cl-an-upgrade.mld 35 + blog/2025/09/index.mld 36 + blog/2025/09/odoc-bugs.mld 37 + blog/2025/11/foundations-of-computer-science.mld 38 + blog/2025/11/index.mld 39 + blog/2025/12/an-svg-is-all-you-need.mld 40 + blog/2025/12/claude-and-dune.mld 41 + blog/2025/12/index.mld 42 + blog/2025/index.mld 43 + blog/2026/01/index.mld 44 + blog/2026/01/weeknotes-2026-03.mld 45 + blog/2026/01/weeknotes-2026-04-05.mld 46 + blog/2026/02/index.mld 47 + blog/2026/02/weeknotes-2026-06.mld 48 + blog/2026/index.mld 49 + blog/index.mld 50 + drafts/index.mld 51 + index.mld 52 + notebooks/foundations/foundations1.mld 53 + notebooks/foundations/foundations10.mld 54 + notebooks/foundations/foundations11.mld 55 + notebooks/foundations/foundations2.mld 56 + notebooks/foundations/foundations3.mld 57 + notebooks/foundations/foundations4.mld 58 + notebooks/foundations/foundations5.mld 59 + notebooks/foundations/foundations6.mld 60 + notebooks/foundations/foundations7.mld 61 + notebooks/foundations/foundations8.mld 62 + notebooks/foundations/foundations9.mld 63 + notebooks/foundations/index.mld 64 + notebooks/index.mld 65 + notebooks/oxcaml/local.mld 66 + reference/index.mld) 67 + (action 68 + (progn 69 + (run 70 + odoc 71 + compile 72 + blog/2025/03/code-block-metadata.mld 73 + --output-dir 74 + _odoc 75 + --parent-id 76 + jon-site/blog/2025/03) 77 + (run 78 + odoc 79 + compile 80 + blog/2025/03/index.mld 81 + --output-dir 82 + _odoc 83 + --parent-id 84 + jon-site/blog/2025/03) 85 + (run 86 + odoc 87 + compile 88 + blog/2025/03/module-type-of.mld 89 + --output-dir 90 + _odoc 91 + --parent-id 92 + jon-site/blog/2025/03) 93 + (run 94 + odoc 95 + compile 96 + blog/2025/04/index.mld 97 + --output-dir 98 + _odoc 99 + --parent-id 100 + jon-site/blog/2025/04) 101 + (run 102 + odoc 103 + compile 104 + blog/2025/04/meeting-the-team.mld 105 + --output-dir 106 + _odoc 107 + --parent-id 108 + jon-site/blog/2025/04) 109 + (run 110 + odoc 111 + compile 112 + blog/2025/04/ocaml-docs-ci-and-odoc-3.mld 113 + --output-dir 114 + _odoc 115 + --parent-id 116 + jon-site/blog/2025/04) 117 + (run 118 + odoc 119 + compile 120 + blog/2025/04/odoc-3.mld 121 + --output-dir 122 + _odoc 123 + --parent-id 124 + jon-site/blog/2025/04) 125 + (run 126 + odoc 127 + compile 128 + blog/2025/04/semantic-versioning-is-hard.mld 129 + --output-dir 130 + _odoc 131 + --parent-id 132 + jon-site/blog/2025/04) 133 + (run 134 + odoc 135 + compile 136 + blog/2025/04/this-site.mld 137 + --output-dir 138 + _odoc 139 + --parent-id 140 + jon-site/blog/2025/04) 141 + (run 142 + odoc 143 + compile 144 + blog/2025/05/ai-for-climate-and-nature-day.mld 145 + --output-dir 146 + _odoc 147 + --parent-id 148 + jon-site/blog/2025/05) 149 + (run 150 + odoc 151 + compile 152 + blog/2025/05/docs-progress.mld 153 + --output-dir 154 + _odoc 155 + --parent-id 156 + jon-site/blog/2025/05) 157 + (run 158 + odoc 159 + compile 160 + blog/2025/05/index.mld 161 + --output-dir 162 + _odoc 163 + --parent-id 164 + jon-site/blog/2025/05) 165 + (run 166 + odoc 167 + compile 168 + blog/2025/05/lots-of-things.mld 169 + --output-dir 170 + _odoc 171 + --parent-id 172 + jon-site/blog/2025/05) 173 + (run 174 + odoc 175 + compile 176 + blog/2025/05/oxcaml-gets-closer.mld 177 + --output-dir 178 + _odoc 179 + --parent-id 180 + jon-site/blog/2025/05) 181 + (run 182 + odoc 183 + compile 184 + blog/2025/05/ticks-solved-by-ai.mld 185 + --output-dir 186 + _odoc 187 + --parent-id 188 + jon-site/blog/2025/05) 189 + (run 190 + odoc 191 + compile 192 + blog/2025/06/index.mld 193 + --output-dir 194 + _odoc 195 + --parent-id 196 + jon-site/blog/2025/06) 197 + (run 198 + odoc 199 + compile 200 + blog/2025/06/week23.mld 201 + --output-dir 202 + _odoc 203 + --parent-id 204 + jon-site/blog/2025/06) 205 + (run 206 + odoc 207 + compile 208 + blog/2025/07/index.mld 209 + --output-dir 210 + _odoc 211 + --parent-id 212 + jon-site/blog/2025/07) 213 + (run 214 + odoc 215 + compile 216 + blog/2025/07/odoc-3-live-on-ocaml-org.mld 217 + --output-dir 218 + _odoc 219 + --parent-id 220 + jon-site/blog/2025/07) 221 + (run 222 + odoc 223 + compile 224 + blog/2025/07/retrospective.mld 225 + --output-dir 226 + _odoc 227 + --parent-id 228 + jon-site/blog/2025/07) 229 + (run 230 + odoc 231 + compile 232 + blog/2025/07/week27.mld 233 + --output-dir 234 + _odoc 235 + --parent-id 236 + jon-site/blog/2025/07) 237 + (run 238 + odoc 239 + compile 240 + blog/2025/07/week28.mld 241 + --output-dir 242 + _odoc 243 + --parent-id 244 + jon-site/blog/2025/07) 245 + (run 246 + odoc 247 + compile 248 + blog/2025/08/index.mld 249 + --output-dir 250 + _odoc 251 + --parent-id 252 + jon-site/blog/2025/08) 253 + (run 254 + odoc 255 + compile 256 + blog/2025/08/ocaml-lsp-mcp.mld 257 + --output-dir 258 + _odoc 259 + --parent-id 260 + jon-site/blog/2025/08) 261 + (run 262 + odoc 263 + compile 264 + blog/2025/08/ocaml-mcp-server.mld 265 + --output-dir 266 + _odoc 267 + --parent-id 268 + jon-site/blog/2025/08) 269 + (run 270 + odoc 271 + compile 272 + blog/2025/08/week33.mld 273 + --output-dir 274 + _odoc 275 + --parent-id 276 + jon-site/blog/2025/08) 277 + (run 278 + odoc 279 + compile 280 + blog/2025/09/build-ids-for-day10.mld 281 + --output-dir 282 + _odoc 283 + --parent-id 284 + jon-site/blog/2025/09) 285 + (run 286 + odoc 287 + compile 288 + blog/2025/09/caching-opam-solutions.mld 289 + --output-dir 290 + _odoc 291 + --parent-id 292 + jon-site/blog/2025/09) 293 + (run 294 + odoc 295 + compile 296 + blog/2025/09/caching-opam-solutions2.mld 297 + --output-dir 298 + _odoc 299 + --parent-id 300 + jon-site/blog/2025/09) 301 + (run 302 + odoc 303 + compile 304 + blog/2025/09/giving-hub-cl-an-upgrade.mld 305 + --output-dir 306 + _odoc 307 + --parent-id 308 + jon-site/blog/2025/09) 309 + (run 310 + odoc 311 + compile 312 + blog/2025/09/index.mld 313 + --output-dir 314 + _odoc 315 + --parent-id 316 + jon-site/blog/2025/09) 317 + (run 318 + odoc 319 + compile 320 + blog/2025/09/odoc-bugs.mld 321 + --output-dir 322 + _odoc 323 + --parent-id 324 + jon-site/blog/2025/09) 325 + (run 326 + odoc 327 + compile 328 + blog/2025/11/foundations-of-computer-science.mld 329 + --output-dir 330 + _odoc 331 + --parent-id 332 + jon-site/blog/2025/11) 333 + (run 334 + odoc 335 + compile 336 + blog/2025/11/index.mld 337 + --output-dir 338 + _odoc 339 + --parent-id 340 + jon-site/blog/2025/11) 341 + (run 342 + odoc 343 + compile 344 + blog/2025/12/an-svg-is-all-you-need.mld 345 + --output-dir 346 + _odoc 347 + --parent-id 348 + jon-site/blog/2025/12) 349 + (run 350 + odoc 351 + compile 352 + blog/2025/12/claude-and-dune.mld 353 + --output-dir 354 + _odoc 355 + --parent-id 356 + jon-site/blog/2025/12) 357 + (run 358 + odoc 359 + compile 360 + blog/2025/12/index.mld 361 + --output-dir 362 + _odoc 363 + --parent-id 364 + jon-site/blog/2025/12) 365 + (run 366 + odoc 367 + compile 368 + blog/2025/index.mld 369 + --output-dir 370 + _odoc 371 + --parent-id 372 + jon-site/blog/2025) 373 + (run 374 + odoc 375 + compile 376 + blog/2026/01/index.mld 377 + --output-dir 378 + _odoc 379 + --parent-id 380 + jon-site/blog/2026/01) 381 + (run 382 + odoc 383 + compile 384 + blog/2026/01/weeknotes-2026-03.mld 385 + --output-dir 386 + _odoc 387 + --parent-id 388 + jon-site/blog/2026/01) 389 + (run 390 + odoc 391 + compile 392 + blog/2026/01/weeknotes-2026-04-05.mld 393 + --output-dir 394 + _odoc 395 + --parent-id 396 + jon-site/blog/2026/01) 397 + (run 398 + odoc 399 + compile 400 + blog/2026/02/index.mld 401 + --output-dir 402 + _odoc 403 + --parent-id 404 + jon-site/blog/2026/02) 405 + (run 406 + odoc 407 + compile 408 + blog/2026/02/weeknotes-2026-06.mld 409 + --output-dir 410 + _odoc 411 + --parent-id 412 + jon-site/blog/2026/02) 413 + (run 414 + odoc 415 + compile 416 + blog/2026/index.mld 417 + --output-dir 418 + _odoc 419 + --parent-id 420 + jon-site/blog/2026) 421 + (run 422 + odoc 423 + compile 424 + blog/index.mld 425 + --output-dir 426 + _odoc 427 + --parent-id 428 + jon-site/blog) 429 + (run 430 + odoc 431 + compile 432 + drafts/index.mld 433 + --output-dir 434 + _odoc 435 + --parent-id 436 + jon-site/drafts) 437 + (run odoc compile index.mld --output-dir _odoc --parent-id jon-site) 438 + (run 439 + odoc 440 + compile 441 + notebooks/foundations/foundations1.mld 442 + --output-dir 443 + _odoc 444 + --parent-id 445 + jon-site/notebooks/foundations) 446 + (run 447 + odoc 448 + compile 449 + notebooks/foundations/foundations10.mld 450 + --output-dir 451 + _odoc 452 + --parent-id 453 + jon-site/notebooks/foundations) 454 + (run 455 + odoc 456 + compile 457 + notebooks/foundations/foundations11.mld 458 + --output-dir 459 + _odoc 460 + --parent-id 461 + jon-site/notebooks/foundations) 462 + (run 463 + odoc 464 + compile 465 + notebooks/foundations/foundations2.mld 466 + --output-dir 467 + _odoc 468 + --parent-id 469 + jon-site/notebooks/foundations) 470 + (run 471 + odoc 472 + compile 473 + notebooks/foundations/foundations3.mld 474 + --output-dir 475 + _odoc 476 + --parent-id 477 + jon-site/notebooks/foundations) 478 + (run 479 + odoc 480 + compile 481 + notebooks/foundations/foundations4.mld 482 + --output-dir 483 + _odoc 484 + --parent-id 485 + jon-site/notebooks/foundations) 486 + (run 487 + odoc 488 + compile 489 + notebooks/foundations/foundations5.mld 490 + --output-dir 491 + _odoc 492 + --parent-id 493 + jon-site/notebooks/foundations) 494 + (run 495 + odoc 496 + compile 497 + notebooks/foundations/foundations6.mld 498 + --output-dir 499 + _odoc 500 + --parent-id 501 + jon-site/notebooks/foundations) 502 + (run 503 + odoc 504 + compile 505 + notebooks/foundations/foundations7.mld 506 + --output-dir 507 + _odoc 508 + --parent-id 509 + jon-site/notebooks/foundations) 510 + (run 511 + odoc 512 + compile 513 + notebooks/foundations/foundations8.mld 514 + --output-dir 515 + _odoc 516 + --parent-id 517 + jon-site/notebooks/foundations) 518 + (run 519 + odoc 520 + compile 521 + notebooks/foundations/foundations9.mld 522 + --output-dir 523 + _odoc 524 + --parent-id 525 + jon-site/notebooks/foundations) 526 + (run 527 + odoc 528 + compile 529 + notebooks/foundations/index.mld 530 + --output-dir 531 + _odoc 532 + --parent-id 533 + jon-site/notebooks/foundations) 534 + (run 535 + odoc 536 + compile 537 + notebooks/index.mld 538 + --output-dir 539 + _odoc 540 + --parent-id 541 + jon-site/notebooks) 542 + (run 543 + odoc 544 + compile 545 + notebooks/oxcaml/local.mld 546 + --output-dir 547 + _odoc 548 + --parent-id 549 + jon-site/notebooks/oxcaml) 550 + (run 551 + odoc 552 + compile 553 + reference/index.mld 554 + --output-dir 555 + _odoc 556 + --parent-id 557 + jon-site/reference) 558 + (run 559 + odoc 560 + link 561 + _odoc/jon-site/blog/2025/03/page-code-block-metadata.odoc 562 + -P 563 + jon-site:_odoc/jon-site 564 + -o 565 + _odoc/jon-site/blog/2025/03/page-code-block-metadata.odocl) 566 + (run 567 + odoc 568 + link 569 + _odoc/jon-site/blog/2025/03/page-index.odoc 570 + -P 571 + jon-site:_odoc/jon-site 572 + -o 573 + _odoc/jon-site/blog/2025/03/page-index.odocl) 574 + (run 575 + odoc 576 + link 577 + _odoc/jon-site/blog/2025/03/page-module-type-of.odoc 578 + -P 579 + jon-site:_odoc/jon-site 580 + -o 581 + _odoc/jon-site/blog/2025/03/page-module-type-of.odocl) 582 + (run 583 + odoc 584 + link 585 + _odoc/jon-site/blog/2025/04/page-index.odoc 586 + -P 587 + jon-site:_odoc/jon-site 588 + -o 589 + _odoc/jon-site/blog/2025/04/page-index.odocl) 590 + (run 591 + odoc 592 + link 593 + _odoc/jon-site/blog/2025/04/page-meeting-the-team.odoc 594 + -P 595 + jon-site:_odoc/jon-site 596 + -o 597 + _odoc/jon-site/blog/2025/04/page-meeting-the-team.odocl) 598 + (run 599 + odoc 600 + link 601 + _odoc/jon-site/blog/2025/04/page-ocaml-docs-ci-and-odoc-3.odoc 602 + -P 603 + jon-site:_odoc/jon-site 604 + -o 605 + _odoc/jon-site/blog/2025/04/page-ocaml-docs-ci-and-odoc-3.odocl) 606 + (run 607 + odoc 608 + link 609 + _odoc/jon-site/blog/2025/04/page-odoc-3.odoc 610 + -P 611 + jon-site:_odoc/jon-site 612 + -o 613 + _odoc/jon-site/blog/2025/04/page-odoc-3.odocl) 614 + (run 615 + odoc 616 + link 617 + _odoc/jon-site/blog/2025/04/page-semantic-versioning-is-hard.odoc 618 + -P 619 + jon-site:_odoc/jon-site 620 + -o 621 + _odoc/jon-site/blog/2025/04/page-semantic-versioning-is-hard.odocl) 622 + (run 623 + odoc 624 + link 625 + _odoc/jon-site/blog/2025/04/page-this-site.odoc 626 + -P 627 + jon-site:_odoc/jon-site 628 + -o 629 + _odoc/jon-site/blog/2025/04/page-this-site.odocl) 630 + (run 631 + odoc 632 + link 633 + _odoc/jon-site/blog/2025/05/page-ai-for-climate-and-nature-day.odoc 634 + -P 635 + jon-site:_odoc/jon-site 636 + -o 637 + _odoc/jon-site/blog/2025/05/page-ai-for-climate-and-nature-day.odocl) 638 + (run 639 + odoc 640 + link 641 + _odoc/jon-site/blog/2025/05/page-docs-progress.odoc 642 + -P 643 + jon-site:_odoc/jon-site 644 + -o 645 + _odoc/jon-site/blog/2025/05/page-docs-progress.odocl) 646 + (run 647 + odoc 648 + link 649 + _odoc/jon-site/blog/2025/05/page-index.odoc 650 + -P 651 + jon-site:_odoc/jon-site 652 + -o 653 + _odoc/jon-site/blog/2025/05/page-index.odocl) 654 + (run 655 + odoc 656 + link 657 + _odoc/jon-site/blog/2025/05/page-lots-of-things.odoc 658 + -P 659 + jon-site:_odoc/jon-site 660 + -o 661 + _odoc/jon-site/blog/2025/05/page-lots-of-things.odocl) 662 + (run 663 + odoc 664 + link 665 + _odoc/jon-site/blog/2025/05/page-oxcaml-gets-closer.odoc 666 + -P 667 + jon-site:_odoc/jon-site 668 + -o 669 + _odoc/jon-site/blog/2025/05/page-oxcaml-gets-closer.odocl) 670 + (run 671 + odoc 672 + link 673 + _odoc/jon-site/blog/2025/05/page-ticks-solved-by-ai.odoc 674 + -P 675 + jon-site:_odoc/jon-site 676 + -o 677 + _odoc/jon-site/blog/2025/05/page-ticks-solved-by-ai.odocl) 678 + (run 679 + odoc 680 + link 681 + _odoc/jon-site/blog/2025/06/page-index.odoc 682 + -P 683 + jon-site:_odoc/jon-site 684 + -o 685 + _odoc/jon-site/blog/2025/06/page-index.odocl) 686 + (run 687 + odoc 688 + link 689 + _odoc/jon-site/blog/2025/06/page-week23.odoc 690 + -P 691 + jon-site:_odoc/jon-site 692 + -o 693 + _odoc/jon-site/blog/2025/06/page-week23.odocl) 694 + (run 695 + odoc 696 + link 697 + _odoc/jon-site/blog/2025/07/page-index.odoc 698 + -P 699 + jon-site:_odoc/jon-site 700 + -o 701 + _odoc/jon-site/blog/2025/07/page-index.odocl) 702 + (run 703 + odoc 704 + link 705 + _odoc/jon-site/blog/2025/07/page-odoc-3-live-on-ocaml-org.odoc 706 + -P 707 + jon-site:_odoc/jon-site 708 + -o 709 + _odoc/jon-site/blog/2025/07/page-odoc-3-live-on-ocaml-org.odocl) 710 + (run 711 + odoc 712 + link 713 + _odoc/jon-site/blog/2025/07/page-retrospective.odoc 714 + -P 715 + jon-site:_odoc/jon-site 716 + -o 717 + _odoc/jon-site/blog/2025/07/page-retrospective.odocl) 718 + (run 719 + odoc 720 + link 721 + _odoc/jon-site/blog/2025/07/page-week27.odoc 722 + -P 723 + jon-site:_odoc/jon-site 724 + -o 725 + _odoc/jon-site/blog/2025/07/page-week27.odocl) 726 + (run 727 + odoc 728 + link 729 + _odoc/jon-site/blog/2025/07/page-week28.odoc 730 + -P 731 + jon-site:_odoc/jon-site 732 + -o 733 + _odoc/jon-site/blog/2025/07/page-week28.odocl) 734 + (run 735 + odoc 736 + link 737 + _odoc/jon-site/blog/2025/08/page-index.odoc 738 + -P 739 + jon-site:_odoc/jon-site 740 + -o 741 + _odoc/jon-site/blog/2025/08/page-index.odocl) 742 + (run 743 + odoc 744 + link 745 + _odoc/jon-site/blog/2025/08/page-ocaml-lsp-mcp.odoc 746 + -P 747 + jon-site:_odoc/jon-site 748 + -o 749 + _odoc/jon-site/blog/2025/08/page-ocaml-lsp-mcp.odocl) 750 + (run 751 + odoc 752 + link 753 + _odoc/jon-site/blog/2025/08/page-ocaml-mcp-server.odoc 754 + -P 755 + jon-site:_odoc/jon-site 756 + -o 757 + _odoc/jon-site/blog/2025/08/page-ocaml-mcp-server.odocl) 758 + (run 759 + odoc 760 + link 761 + _odoc/jon-site/blog/2025/08/page-week33.odoc 762 + -P 763 + jon-site:_odoc/jon-site 764 + -o 765 + _odoc/jon-site/blog/2025/08/page-week33.odocl) 766 + (run 767 + odoc 768 + link 769 + _odoc/jon-site/blog/2025/09/page-build-ids-for-day10.odoc 770 + -P 771 + jon-site:_odoc/jon-site 772 + -o 773 + _odoc/jon-site/blog/2025/09/page-build-ids-for-day10.odocl) 774 + (run 775 + odoc 776 + link 777 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions.odoc 778 + -P 779 + jon-site:_odoc/jon-site 780 + -o 781 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions.odocl) 782 + (run 783 + odoc 784 + link 785 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions2.odoc 786 + -P 787 + jon-site:_odoc/jon-site 788 + -o 789 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions2.odocl) 790 + (run 791 + odoc 792 + link 793 + _odoc/jon-site/blog/2025/09/page-giving-hub-cl-an-upgrade.odoc 794 + -P 795 + jon-site:_odoc/jon-site 796 + -o 797 + _odoc/jon-site/blog/2025/09/page-giving-hub-cl-an-upgrade.odocl) 798 + (run 799 + odoc 800 + link 801 + _odoc/jon-site/blog/2025/09/page-index.odoc 802 + -P 803 + jon-site:_odoc/jon-site 804 + -o 805 + _odoc/jon-site/blog/2025/09/page-index.odocl) 806 + (run 807 + odoc 808 + link 809 + _odoc/jon-site/blog/2025/09/page-odoc-bugs.odoc 810 + -P 811 + jon-site:_odoc/jon-site 812 + -o 813 + _odoc/jon-site/blog/2025/09/page-odoc-bugs.odocl) 814 + (run 815 + odoc 816 + link 817 + _odoc/jon-site/blog/2025/11/page-foundations-of-computer-science.odoc 818 + -P 819 + jon-site:_odoc/jon-site 820 + -o 821 + _odoc/jon-site/blog/2025/11/page-foundations-of-computer-science.odocl) 822 + (run 823 + odoc 824 + link 825 + _odoc/jon-site/blog/2025/11/page-index.odoc 826 + -P 827 + jon-site:_odoc/jon-site 828 + -o 829 + _odoc/jon-site/blog/2025/11/page-index.odocl) 830 + (run 831 + odoc 832 + link 833 + _odoc/jon-site/blog/2025/12/page-an-svg-is-all-you-need.odoc 834 + -P 835 + jon-site:_odoc/jon-site 836 + -o 837 + _odoc/jon-site/blog/2025/12/page-an-svg-is-all-you-need.odocl) 838 + (run 839 + odoc 840 + link 841 + _odoc/jon-site/blog/2025/12/page-claude-and-dune.odoc 842 + -P 843 + jon-site:_odoc/jon-site 844 + -o 845 + _odoc/jon-site/blog/2025/12/page-claude-and-dune.odocl) 846 + (run 847 + odoc 848 + link 849 + _odoc/jon-site/blog/2025/12/page-index.odoc 850 + -P 851 + jon-site:_odoc/jon-site 852 + -o 853 + _odoc/jon-site/blog/2025/12/page-index.odocl) 854 + (run 855 + odoc 856 + link 857 + _odoc/jon-site/blog/2025/page-index.odoc 858 + -P 859 + jon-site:_odoc/jon-site 860 + -o 861 + _odoc/jon-site/blog/2025/page-index.odocl) 862 + (run 863 + odoc 864 + link 865 + _odoc/jon-site/blog/2026/01/page-index.odoc 866 + -P 867 + jon-site:_odoc/jon-site 868 + -o 869 + _odoc/jon-site/blog/2026/01/page-index.odocl) 870 + (run 871 + odoc 872 + link 873 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-03.odoc 874 + -P 875 + jon-site:_odoc/jon-site 876 + -o 877 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-03.odocl) 878 + (run 879 + odoc 880 + link 881 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-04-05.odoc 882 + -P 883 + jon-site:_odoc/jon-site 884 + -o 885 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-04-05.odocl) 886 + (run 887 + odoc 888 + link 889 + _odoc/jon-site/blog/2026/02/page-index.odoc 890 + -P 891 + jon-site:_odoc/jon-site 892 + -o 893 + _odoc/jon-site/blog/2026/02/page-index.odocl) 894 + (run 895 + odoc 896 + link 897 + _odoc/jon-site/blog/2026/02/page-weeknotes-2026-06.odoc 898 + -P 899 + jon-site:_odoc/jon-site 900 + -o 901 + _odoc/jon-site/blog/2026/02/page-weeknotes-2026-06.odocl) 902 + (run 903 + odoc 904 + link 905 + _odoc/jon-site/blog/2026/page-index.odoc 906 + -P 907 + jon-site:_odoc/jon-site 908 + -o 909 + _odoc/jon-site/blog/2026/page-index.odocl) 910 + (run 911 + odoc 912 + link 913 + _odoc/jon-site/blog/page-index.odoc 914 + -P 915 + jon-site:_odoc/jon-site 916 + -o 917 + _odoc/jon-site/blog/page-index.odocl) 918 + (run 919 + odoc 920 + link 921 + _odoc/jon-site/drafts/page-index.odoc 922 + -P 923 + jon-site:_odoc/jon-site 924 + -o 925 + _odoc/jon-site/drafts/page-index.odocl) 926 + (run 927 + odoc 928 + link 929 + _odoc/jon-site/page-index.odoc 930 + -P 931 + jon-site:_odoc/jon-site 932 + -o 933 + _odoc/jon-site/page-index.odocl) 934 + (run 935 + odoc 936 + link 937 + _odoc/jon-site/notebooks/foundations/page-foundations1.odoc 938 + -P 939 + jon-site:_odoc/jon-site 940 + -o 941 + _odoc/jon-site/notebooks/foundations/page-foundations1.odocl) 942 + (run 943 + odoc 944 + link 945 + _odoc/jon-site/notebooks/foundations/page-foundations10.odoc 946 + -P 947 + jon-site:_odoc/jon-site 948 + -o 949 + _odoc/jon-site/notebooks/foundations/page-foundations10.odocl) 950 + (run 951 + odoc 952 + link 953 + _odoc/jon-site/notebooks/foundations/page-foundations11.odoc 954 + -P 955 + jon-site:_odoc/jon-site 956 + -o 957 + _odoc/jon-site/notebooks/foundations/page-foundations11.odocl) 958 + (run 959 + odoc 960 + link 961 + _odoc/jon-site/notebooks/foundations/page-foundations2.odoc 962 + -P 963 + jon-site:_odoc/jon-site 964 + -o 965 + _odoc/jon-site/notebooks/foundations/page-foundations2.odocl) 966 + (run 967 + odoc 968 + link 969 + _odoc/jon-site/notebooks/foundations/page-foundations3.odoc 970 + -P 971 + jon-site:_odoc/jon-site 972 + -o 973 + _odoc/jon-site/notebooks/foundations/page-foundations3.odocl) 974 + (run 975 + odoc 976 + link 977 + _odoc/jon-site/notebooks/foundations/page-foundations4.odoc 978 + -P 979 + jon-site:_odoc/jon-site 980 + -o 981 + _odoc/jon-site/notebooks/foundations/page-foundations4.odocl) 982 + (run 983 + odoc 984 + link 985 + _odoc/jon-site/notebooks/foundations/page-foundations5.odoc 986 + -P 987 + jon-site:_odoc/jon-site 988 + -o 989 + _odoc/jon-site/notebooks/foundations/page-foundations5.odocl) 990 + (run 991 + odoc 992 + link 993 + _odoc/jon-site/notebooks/foundations/page-foundations6.odoc 994 + -P 995 + jon-site:_odoc/jon-site 996 + -o 997 + _odoc/jon-site/notebooks/foundations/page-foundations6.odocl) 998 + (run 999 + odoc 1000 + link 1001 + _odoc/jon-site/notebooks/foundations/page-foundations7.odoc 1002 + -P 1003 + jon-site:_odoc/jon-site 1004 + -o 1005 + _odoc/jon-site/notebooks/foundations/page-foundations7.odocl) 1006 + (run 1007 + odoc 1008 + link 1009 + _odoc/jon-site/notebooks/foundations/page-foundations8.odoc 1010 + -P 1011 + jon-site:_odoc/jon-site 1012 + -o 1013 + _odoc/jon-site/notebooks/foundations/page-foundations8.odocl) 1014 + (run 1015 + odoc 1016 + link 1017 + _odoc/jon-site/notebooks/foundations/page-foundations9.odoc 1018 + -P 1019 + jon-site:_odoc/jon-site 1020 + -o 1021 + _odoc/jon-site/notebooks/foundations/page-foundations9.odocl) 1022 + (run 1023 + odoc 1024 + link 1025 + _odoc/jon-site/notebooks/foundations/page-index.odoc 1026 + -P 1027 + jon-site:_odoc/jon-site 1028 + -o 1029 + _odoc/jon-site/notebooks/foundations/page-index.odocl) 1030 + (run 1031 + odoc 1032 + link 1033 + _odoc/jon-site/notebooks/page-index.odoc 1034 + -P 1035 + jon-site:_odoc/jon-site 1036 + -o 1037 + _odoc/jon-site/notebooks/page-index.odocl) 1038 + (run 1039 + odoc 1040 + link 1041 + _odoc/jon-site/notebooks/oxcaml/page-local.odoc 1042 + -P 1043 + jon-site:_odoc/jon-site 1044 + -o 1045 + _odoc/jon-site/notebooks/oxcaml/page-local.odocl) 1046 + (run 1047 + odoc 1048 + link 1049 + _odoc/jon-site/reference/page-index.odoc 1050 + -P 1051 + jon-site:_odoc/jon-site 1052 + -o 1053 + _odoc/jon-site/reference/page-index.odocl)))) 1054 + 1055 + (rule 1056 + (target 1057 + (dir _html)) 1058 + (deps 1059 + _odoc/jon-site/blog/2025/03/page-code-block-metadata.odocl 1060 + _odoc/jon-site/blog/2025/03/page-index.odocl 1061 + _odoc/jon-site/blog/2025/03/page-module-type-of.odocl 1062 + _odoc/jon-site/blog/2025/04/page-index.odocl 1063 + _odoc/jon-site/blog/2025/04/page-meeting-the-team.odocl 1064 + _odoc/jon-site/blog/2025/04/page-ocaml-docs-ci-and-odoc-3.odocl 1065 + _odoc/jon-site/blog/2025/04/page-odoc-3.odocl 1066 + _odoc/jon-site/blog/2025/04/page-semantic-versioning-is-hard.odocl 1067 + _odoc/jon-site/blog/2025/04/page-this-site.odocl 1068 + _odoc/jon-site/blog/2025/05/page-ai-for-climate-and-nature-day.odocl 1069 + _odoc/jon-site/blog/2025/05/page-docs-progress.odocl 1070 + _odoc/jon-site/blog/2025/05/page-index.odocl 1071 + _odoc/jon-site/blog/2025/05/page-lots-of-things.odocl 1072 + _odoc/jon-site/blog/2025/05/page-oxcaml-gets-closer.odocl 1073 + _odoc/jon-site/blog/2025/05/page-ticks-solved-by-ai.odocl 1074 + _odoc/jon-site/blog/2025/06/page-index.odocl 1075 + _odoc/jon-site/blog/2025/06/page-week23.odocl 1076 + _odoc/jon-site/blog/2025/07/page-index.odocl 1077 + _odoc/jon-site/blog/2025/07/page-odoc-3-live-on-ocaml-org.odocl 1078 + _odoc/jon-site/blog/2025/07/page-retrospective.odocl 1079 + _odoc/jon-site/blog/2025/07/page-week27.odocl 1080 + _odoc/jon-site/blog/2025/07/page-week28.odocl 1081 + _odoc/jon-site/blog/2025/08/page-index.odocl 1082 + _odoc/jon-site/blog/2025/08/page-ocaml-lsp-mcp.odocl 1083 + _odoc/jon-site/blog/2025/08/page-ocaml-mcp-server.odocl 1084 + _odoc/jon-site/blog/2025/08/page-week33.odocl 1085 + _odoc/jon-site/blog/2025/09/page-build-ids-for-day10.odocl 1086 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions.odocl 1087 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions2.odocl 1088 + _odoc/jon-site/blog/2025/09/page-giving-hub-cl-an-upgrade.odocl 1089 + _odoc/jon-site/blog/2025/09/page-index.odocl 1090 + _odoc/jon-site/blog/2025/09/page-odoc-bugs.odocl 1091 + _odoc/jon-site/blog/2025/11/page-foundations-of-computer-science.odocl 1092 + _odoc/jon-site/blog/2025/11/page-index.odocl 1093 + _odoc/jon-site/blog/2025/12/page-an-svg-is-all-you-need.odocl 1094 + _odoc/jon-site/blog/2025/12/page-claude-and-dune.odocl 1095 + _odoc/jon-site/blog/2025/12/page-index.odocl 1096 + _odoc/jon-site/blog/2025/page-index.odocl 1097 + _odoc/jon-site/blog/2026/01/page-index.odocl 1098 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-03.odocl 1099 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-04-05.odocl 1100 + _odoc/jon-site/blog/2026/02/page-index.odocl 1101 + _odoc/jon-site/blog/2026/02/page-weeknotes-2026-06.odocl 1102 + _odoc/jon-site/blog/2026/page-index.odocl 1103 + _odoc/jon-site/blog/page-index.odocl 1104 + _odoc/jon-site/drafts/page-index.odocl 1105 + _odoc/jon-site/page-index.odocl 1106 + _odoc/jon-site/notebooks/foundations/page-foundations1.odocl 1107 + _odoc/jon-site/notebooks/foundations/page-foundations10.odocl 1108 + _odoc/jon-site/notebooks/foundations/page-foundations11.odocl 1109 + _odoc/jon-site/notebooks/foundations/page-foundations2.odocl 1110 + _odoc/jon-site/notebooks/foundations/page-foundations3.odocl 1111 + _odoc/jon-site/notebooks/foundations/page-foundations4.odocl 1112 + _odoc/jon-site/notebooks/foundations/page-foundations5.odocl 1113 + _odoc/jon-site/notebooks/foundations/page-foundations6.odocl 1114 + _odoc/jon-site/notebooks/foundations/page-foundations7.odocl 1115 + _odoc/jon-site/notebooks/foundations/page-foundations8.odocl 1116 + _odoc/jon-site/notebooks/foundations/page-foundations9.odocl 1117 + _odoc/jon-site/notebooks/foundations/page-index.odocl 1118 + _odoc/jon-site/notebooks/page-index.odocl 1119 + _odoc/jon-site/notebooks/oxcaml/page-local.odocl 1120 + _odoc/jon-site/reference/page-index.odocl 1121 + static/assets/jon.jpg) 1122 + (action 1123 + (progn 1124 + (run 1125 + odoc 1126 + html-generate 1127 + --shell 1128 + jon-shell 1129 + -o 1130 + _html 1131 + _odoc/jon-site/blog/2025/03/page-code-block-metadata.odocl) 1132 + (run 1133 + odoc 1134 + html-generate 1135 + --shell 1136 + jon-shell 1137 + -o 1138 + _html 1139 + _odoc/jon-site/blog/2025/03/page-index.odocl) 1140 + (run 1141 + odoc 1142 + html-generate 1143 + --shell 1144 + jon-shell 1145 + -o 1146 + _html 1147 + _odoc/jon-site/blog/2025/03/page-module-type-of.odocl) 1148 + (run 1149 + odoc 1150 + html-generate 1151 + --shell 1152 + jon-shell 1153 + -o 1154 + _html 1155 + _odoc/jon-site/blog/2025/04/page-index.odocl) 1156 + (run 1157 + odoc 1158 + html-generate 1159 + --shell 1160 + jon-shell 1161 + -o 1162 + _html 1163 + _odoc/jon-site/blog/2025/04/page-meeting-the-team.odocl) 1164 + (run 1165 + odoc 1166 + html-generate 1167 + --shell 1168 + jon-shell 1169 + -o 1170 + _html 1171 + _odoc/jon-site/blog/2025/04/page-ocaml-docs-ci-and-odoc-3.odocl) 1172 + (run 1173 + odoc 1174 + html-generate 1175 + --shell 1176 + jon-shell 1177 + -o 1178 + _html 1179 + _odoc/jon-site/blog/2025/04/page-odoc-3.odocl) 1180 + (run 1181 + odoc 1182 + html-generate 1183 + --shell 1184 + jon-shell 1185 + -o 1186 + _html 1187 + _odoc/jon-site/blog/2025/04/page-semantic-versioning-is-hard.odocl) 1188 + (run 1189 + odoc 1190 + html-generate 1191 + --shell 1192 + jon-shell 1193 + -o 1194 + _html 1195 + _odoc/jon-site/blog/2025/04/page-this-site.odocl) 1196 + (run 1197 + odoc 1198 + html-generate 1199 + --shell 1200 + jon-shell 1201 + -o 1202 + _html 1203 + _odoc/jon-site/blog/2025/05/page-ai-for-climate-and-nature-day.odocl) 1204 + (run 1205 + odoc 1206 + html-generate 1207 + --shell 1208 + jon-shell 1209 + -o 1210 + _html 1211 + _odoc/jon-site/blog/2025/05/page-docs-progress.odocl) 1212 + (run 1213 + odoc 1214 + html-generate 1215 + --shell 1216 + jon-shell 1217 + -o 1218 + _html 1219 + _odoc/jon-site/blog/2025/05/page-index.odocl) 1220 + (run 1221 + odoc 1222 + html-generate 1223 + --shell 1224 + jon-shell 1225 + -o 1226 + _html 1227 + _odoc/jon-site/blog/2025/05/page-lots-of-things.odocl) 1228 + (run 1229 + odoc 1230 + html-generate 1231 + --shell 1232 + jon-shell 1233 + -o 1234 + _html 1235 + _odoc/jon-site/blog/2025/05/page-oxcaml-gets-closer.odocl) 1236 + (run 1237 + odoc 1238 + html-generate 1239 + --shell 1240 + jon-shell 1241 + -o 1242 + _html 1243 + _odoc/jon-site/blog/2025/05/page-ticks-solved-by-ai.odocl) 1244 + (run 1245 + odoc 1246 + html-generate 1247 + --shell 1248 + jon-shell 1249 + -o 1250 + _html 1251 + _odoc/jon-site/blog/2025/06/page-index.odocl) 1252 + (run 1253 + odoc 1254 + html-generate 1255 + --shell 1256 + jon-shell 1257 + -o 1258 + _html 1259 + _odoc/jon-site/blog/2025/06/page-week23.odocl) 1260 + (run 1261 + odoc 1262 + html-generate 1263 + --shell 1264 + jon-shell 1265 + -o 1266 + _html 1267 + _odoc/jon-site/blog/2025/07/page-index.odocl) 1268 + (run 1269 + odoc 1270 + html-generate 1271 + --shell 1272 + jon-shell 1273 + -o 1274 + _html 1275 + _odoc/jon-site/blog/2025/07/page-odoc-3-live-on-ocaml-org.odocl) 1276 + (run 1277 + odoc 1278 + html-generate 1279 + --shell 1280 + jon-shell 1281 + -o 1282 + _html 1283 + _odoc/jon-site/blog/2025/07/page-retrospective.odocl) 1284 + (run 1285 + odoc 1286 + html-generate 1287 + --shell 1288 + jon-shell 1289 + -o 1290 + _html 1291 + _odoc/jon-site/blog/2025/07/page-week27.odocl) 1292 + (run 1293 + odoc 1294 + html-generate 1295 + --shell 1296 + jon-shell 1297 + -o 1298 + _html 1299 + _odoc/jon-site/blog/2025/07/page-week28.odocl) 1300 + (run 1301 + odoc 1302 + html-generate 1303 + --shell 1304 + jon-shell 1305 + -o 1306 + _html 1307 + _odoc/jon-site/blog/2025/08/page-index.odocl) 1308 + (run 1309 + odoc 1310 + html-generate 1311 + --shell 1312 + jon-shell 1313 + -o 1314 + _html 1315 + _odoc/jon-site/blog/2025/08/page-ocaml-lsp-mcp.odocl) 1316 + (run 1317 + odoc 1318 + html-generate 1319 + --shell 1320 + jon-shell 1321 + -o 1322 + _html 1323 + _odoc/jon-site/blog/2025/08/page-ocaml-mcp-server.odocl) 1324 + (run 1325 + odoc 1326 + html-generate 1327 + --shell 1328 + jon-shell 1329 + -o 1330 + _html 1331 + _odoc/jon-site/blog/2025/08/page-week33.odocl) 1332 + (run 1333 + odoc 1334 + html-generate 1335 + --shell 1336 + jon-shell 1337 + -o 1338 + _html 1339 + _odoc/jon-site/blog/2025/09/page-build-ids-for-day10.odocl) 1340 + (run 1341 + odoc 1342 + html-generate 1343 + --shell 1344 + jon-shell 1345 + -o 1346 + _html 1347 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions.odocl) 1348 + (run 1349 + odoc 1350 + html-generate 1351 + --shell 1352 + jon-shell 1353 + -o 1354 + _html 1355 + _odoc/jon-site/blog/2025/09/page-caching-opam-solutions2.odocl) 1356 + (run 1357 + odoc 1358 + html-generate 1359 + --shell 1360 + jon-shell 1361 + -o 1362 + _html 1363 + _odoc/jon-site/blog/2025/09/page-giving-hub-cl-an-upgrade.odocl) 1364 + (run 1365 + odoc 1366 + html-generate 1367 + --shell 1368 + jon-shell 1369 + -o 1370 + _html 1371 + _odoc/jon-site/blog/2025/09/page-index.odocl) 1372 + (run 1373 + odoc 1374 + html-generate 1375 + --shell 1376 + jon-shell 1377 + -o 1378 + _html 1379 + _odoc/jon-site/blog/2025/09/page-odoc-bugs.odocl) 1380 + (run 1381 + odoc 1382 + html-generate 1383 + --shell 1384 + jon-shell 1385 + -o 1386 + _html 1387 + _odoc/jon-site/blog/2025/11/page-foundations-of-computer-science.odocl) 1388 + (run 1389 + odoc 1390 + html-generate 1391 + --shell 1392 + jon-shell 1393 + -o 1394 + _html 1395 + _odoc/jon-site/blog/2025/11/page-index.odocl) 1396 + (run 1397 + odoc 1398 + html-generate 1399 + --shell 1400 + jon-shell 1401 + -o 1402 + _html 1403 + _odoc/jon-site/blog/2025/12/page-an-svg-is-all-you-need.odocl) 1404 + (run 1405 + odoc 1406 + html-generate 1407 + --shell 1408 + jon-shell 1409 + -o 1410 + _html 1411 + _odoc/jon-site/blog/2025/12/page-claude-and-dune.odocl) 1412 + (run 1413 + odoc 1414 + html-generate 1415 + --shell 1416 + jon-shell 1417 + -o 1418 + _html 1419 + _odoc/jon-site/blog/2025/12/page-index.odocl) 1420 + (run 1421 + odoc 1422 + html-generate 1423 + --shell 1424 + jon-shell 1425 + -o 1426 + _html 1427 + _odoc/jon-site/blog/2025/page-index.odocl) 1428 + (run 1429 + odoc 1430 + html-generate 1431 + --shell 1432 + jon-shell 1433 + -o 1434 + _html 1435 + _odoc/jon-site/blog/2026/01/page-index.odocl) 1436 + (run 1437 + odoc 1438 + html-generate 1439 + --shell 1440 + jon-shell 1441 + -o 1442 + _html 1443 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-03.odocl) 1444 + (run 1445 + odoc 1446 + html-generate 1447 + --shell 1448 + jon-shell 1449 + -o 1450 + _html 1451 + _odoc/jon-site/blog/2026/01/page-weeknotes-2026-04-05.odocl) 1452 + (run 1453 + odoc 1454 + html-generate 1455 + --shell 1456 + jon-shell 1457 + -o 1458 + _html 1459 + _odoc/jon-site/blog/2026/02/page-index.odocl) 1460 + (run 1461 + odoc 1462 + html-generate 1463 + --shell 1464 + jon-shell 1465 + -o 1466 + _html 1467 + _odoc/jon-site/blog/2026/02/page-weeknotes-2026-06.odocl) 1468 + (run 1469 + odoc 1470 + html-generate 1471 + --shell 1472 + jon-shell 1473 + -o 1474 + _html 1475 + _odoc/jon-site/blog/2026/page-index.odocl) 1476 + (run 1477 + odoc 1478 + html-generate 1479 + --shell 1480 + jon-shell 1481 + -o 1482 + _html 1483 + _odoc/jon-site/blog/page-index.odocl) 1484 + (run 1485 + odoc 1486 + html-generate 1487 + --shell 1488 + jon-shell 1489 + -o 1490 + _html 1491 + _odoc/jon-site/drafts/page-index.odocl) 1492 + (run 1493 + odoc 1494 + html-generate 1495 + --shell 1496 + jon-shell 1497 + -o 1498 + _html 1499 + _odoc/jon-site/page-index.odocl) 1500 + (run 1501 + odoc 1502 + html-generate 1503 + --shell 1504 + jon-shell 1505 + -o 1506 + _html 1507 + _odoc/jon-site/notebooks/foundations/page-foundations1.odocl) 1508 + (run 1509 + odoc 1510 + html-generate 1511 + --shell 1512 + jon-shell 1513 + -o 1514 + _html 1515 + _odoc/jon-site/notebooks/foundations/page-foundations10.odocl) 1516 + (run 1517 + odoc 1518 + html-generate 1519 + --shell 1520 + jon-shell 1521 + -o 1522 + _html 1523 + _odoc/jon-site/notebooks/foundations/page-foundations11.odocl) 1524 + (run 1525 + odoc 1526 + html-generate 1527 + --shell 1528 + jon-shell 1529 + -o 1530 + _html 1531 + _odoc/jon-site/notebooks/foundations/page-foundations2.odocl) 1532 + (run 1533 + odoc 1534 + html-generate 1535 + --shell 1536 + jon-shell 1537 + -o 1538 + _html 1539 + _odoc/jon-site/notebooks/foundations/page-foundations3.odocl) 1540 + (run 1541 + odoc 1542 + html-generate 1543 + --shell 1544 + jon-shell 1545 + -o 1546 + _html 1547 + _odoc/jon-site/notebooks/foundations/page-foundations4.odocl) 1548 + (run 1549 + odoc 1550 + html-generate 1551 + --shell 1552 + jon-shell 1553 + -o 1554 + _html 1555 + _odoc/jon-site/notebooks/foundations/page-foundations5.odocl) 1556 + (run 1557 + odoc 1558 + html-generate 1559 + --shell 1560 + jon-shell 1561 + -o 1562 + _html 1563 + _odoc/jon-site/notebooks/foundations/page-foundations6.odocl) 1564 + (run 1565 + odoc 1566 + html-generate 1567 + --shell 1568 + jon-shell 1569 + -o 1570 + _html 1571 + _odoc/jon-site/notebooks/foundations/page-foundations7.odocl) 1572 + (run 1573 + odoc 1574 + html-generate 1575 + --shell 1576 + jon-shell 1577 + -o 1578 + _html 1579 + _odoc/jon-site/notebooks/foundations/page-foundations8.odocl) 1580 + (run 1581 + odoc 1582 + html-generate 1583 + --shell 1584 + jon-shell 1585 + -o 1586 + _html 1587 + _odoc/jon-site/notebooks/foundations/page-foundations9.odocl) 1588 + (run 1589 + odoc 1590 + html-generate 1591 + --shell 1592 + jon-shell 1593 + -o 1594 + _html 1595 + _odoc/jon-site/notebooks/foundations/page-index.odocl) 1596 + (run 1597 + odoc 1598 + html-generate 1599 + --shell 1600 + jon-shell 1601 + -o 1602 + _html 1603 + _odoc/jon-site/notebooks/page-index.odocl) 1604 + (run 1605 + odoc 1606 + html-generate 1607 + --shell 1608 + jon-shell 1609 + -o 1610 + _html 1611 + _odoc/jon-site/notebooks/oxcaml/page-local.odocl) 1612 + (run 1613 + odoc 1614 + html-generate 1615 + --shell 1616 + jon-shell 1617 + -o 1618 + _html 1619 + _odoc/jon-site/reference/page-index.odocl) 1620 + (run odoc support-files -o _html) 1621 + (system 1622 + "mkdir -p $(dirname _html/jon-site/static/assets/jon.jpg) && cp static/assets/jon.jpg _html/jon-site/static/assets/jon.jpg")))) 1623 + 1624 + (alias 1625 + (name site) 1626 + (deps 1627 + _html/jon-site/blog/2025/03/code-block-metadata.html 1628 + _html/jon-site/blog/2025/03/index.html 1629 + _html/jon-site/blog/2025/03/module-type-of.html 1630 + _html/jon-site/blog/2025/04/index.html 1631 + _html/jon-site/blog/2025/04/meeting-the-team.html 1632 + _html/jon-site/blog/2025/04/ocaml-docs-ci-and-odoc-3.html 1633 + _html/jon-site/blog/2025/04/odoc-3.html 1634 + _html/jon-site/blog/2025/04/semantic-versioning-is-hard.html 1635 + _html/jon-site/blog/2025/04/this-site.html 1636 + _html/jon-site/blog/2025/05/ai-for-climate-and-nature-day.html 1637 + _html/jon-site/blog/2025/05/docs-progress.html 1638 + _html/jon-site/blog/2025/05/index.html 1639 + _html/jon-site/blog/2025/05/lots-of-things.html 1640 + _html/jon-site/blog/2025/05/oxcaml-gets-closer.html 1641 + _html/jon-site/blog/2025/05/ticks-solved-by-ai.html 1642 + _html/jon-site/blog/2025/06/index.html 1643 + _html/jon-site/blog/2025/06/week23.html 1644 + _html/jon-site/blog/2025/07/index.html 1645 + _html/jon-site/blog/2025/07/odoc-3-live-on-ocaml-org.html 1646 + _html/jon-site/blog/2025/07/retrospective.html 1647 + _html/jon-site/blog/2025/07/week27.html 1648 + _html/jon-site/blog/2025/07/week28.html 1649 + _html/jon-site/blog/2025/08/index.html 1650 + _html/jon-site/blog/2025/08/ocaml-lsp-mcp.html 1651 + _html/jon-site/blog/2025/08/ocaml-mcp-server.html 1652 + _html/jon-site/blog/2025/08/week33.html 1653 + _html/jon-site/blog/2025/09/build-ids-for-day10.html 1654 + _html/jon-site/blog/2025/09/caching-opam-solutions.html 1655 + _html/jon-site/blog/2025/09/caching-opam-solutions2.html 1656 + _html/jon-site/blog/2025/09/giving-hub-cl-an-upgrade.html 1657 + _html/jon-site/blog/2025/09/index.html 1658 + _html/jon-site/blog/2025/09/odoc-bugs.html 1659 + _html/jon-site/blog/2025/11/foundations-of-computer-science.html 1660 + _html/jon-site/blog/2025/11/index.html 1661 + _html/jon-site/blog/2025/12/an-svg-is-all-you-need.html 1662 + _html/jon-site/blog/2025/12/claude-and-dune.html 1663 + _html/jon-site/blog/2025/12/index.html 1664 + _html/jon-site/blog/2025/index.html 1665 + _html/jon-site/blog/2026/01/index.html 1666 + _html/jon-site/blog/2026/01/weeknotes-2026-03.html 1667 + _html/jon-site/blog/2026/01/weeknotes-2026-04-05.html 1668 + _html/jon-site/blog/2026/02/index.html 1669 + _html/jon-site/blog/2026/02/weeknotes-2026-06.html 1670 + _html/jon-site/blog/2026/index.html 1671 + _html/jon-site/blog/index.html 1672 + _html/jon-site/drafts/index.html 1673 + _html/jon-site/index.html 1674 + _html/jon-site/notebooks/foundations/foundations1.html 1675 + _html/jon-site/notebooks/foundations/foundations10.html 1676 + _html/jon-site/notebooks/foundations/foundations11.html 1677 + _html/jon-site/notebooks/foundations/foundations2.html 1678 + _html/jon-site/notebooks/foundations/foundations3.html 1679 + _html/jon-site/notebooks/foundations/foundations4.html 1680 + _html/jon-site/notebooks/foundations/foundations5.html 1681 + _html/jon-site/notebooks/foundations/foundations6.html 1682 + _html/jon-site/notebooks/foundations/foundations7.html 1683 + _html/jon-site/notebooks/foundations/foundations8.html 1684 + _html/jon-site/notebooks/foundations/foundations9.html 1685 + _html/jon-site/notebooks/foundations/index.html 1686 + _html/jon-site/notebooks/index.html 1687 + _html/jon-site/notebooks/oxcaml/local.html 1688 + _html/jon-site/reference/index.html 1689 + _html/jon-site/static/assets/jon.jpg))