My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

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

Add post links to month blog indexes

Month indexes now list posts with links, matching the year index
format. Previously they only had @children_order and the title.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+55 -7
+7 -2
scripts/gen_blog_index.ml
··· 87 87 |> List.map (fun p -> p.slug) 88 88 |> String.concat " " 89 89 in 90 - let content = Printf.sprintf "@children_order %s\n\n{0 %s}\n\n" 91 - children (month_name month) 90 + let post_links = 91 + month_posts 92 + |> List.map (fun p -> "- " ^ post_link p) 93 + |> String.concat "\n" 94 + in 95 + let content = Printf.sprintf "@children_order %s\n\n{0 %s}\n\n%s\n" 96 + children (month_name month) post_links 92 97 in 93 98 Some content 94 99
+2
site/blog/2025/03/index.mld
··· 2 2 3 3 {0 March} 4 4 5 + - {{!//blog/2025/03/page-"module-type-of"}The Road to Odoc 3: Module Type Of} 6 + - {{!//blog/2025/03/page-"code-block-metadata"}Code block metadata}
+5
site/blog/2025/04/index.mld
··· 2 2 3 3 {0 April} 4 4 5 + - {{!//blog/2025/04/page-"ocaml-docs-ci-and-odoc-3"}OCaml-Docs-CI and Odoc 3} 6 + - {{!//blog/2025/04/page-"odoc-3"}Odoc 3: So what?} 7 + - {{!//blog/2025/04/page-"semantic-versioning-is-hard"}Semantic Versioning in OCaml is Hard} 8 + - {{!//blog/2025/04/page-"meeting-the-team"}Meeting the Team} 9 + - {{!//blog/2025/04/page-"this-site"}This site}
+5
site/blog/2025/05/index.mld
··· 2 2 3 3 {0 May} 4 4 5 + - {{!//blog/2025/05/page-"docs-progress"}Progress in OCaml docs} 6 + - {{!//blog/2025/05/page-"lots-of-things"}Lots of things have been happening} 7 + - {{!//blog/2025/05/page-"ticks-solved-by-ai"}Solving First-year OCaml exercises with AI} 8 + - {{!//blog/2025/05/page-"oxcaml-gets-closer"}OxCaml is getting closer...} 9 + - {{!//blog/2025/05/page-"ai-for-climate-and-nature-day"}AI for Climate & Nature Community Day}
+1
site/blog/2025/06/index.mld
··· 2 2 3 3 {0 June} 4 4 5 + - {{!//blog/2025/06/page-week23}Week 23}
+4
site/blog/2025/07/index.mld
··· 2 2 3 3 {0 July} 4 4 5 + - {{!//blog/2025/07/page-retrospective}4 months in, a retrospective} 6 + - {{!//blog/2025/07/page-week28}Week 28} 7 + - {{!//blog/2025/07/page-"odoc-3-live-on-ocaml-org"}Odoc 3 is live on OCaml.org!} 8 + - {{!//blog/2025/07/page-week27}Weeks 24-27}
+3
site/blog/2025/08/index.mld
··· 2 2 3 3 {0 August} 4 4 5 + - {{!//blog/2025/08/page-"ocaml-lsp-mcp"}Using ocaml-lsp-server via an MCP server} 6 + - {{!//blog/2025/08/page-"ocaml-mcp-server"}An OCaml MCP server} 7 + - {{!//blog/2025/08/page-week33}Week 33}
+5
site/blog/2025/09/index.mld
··· 2 2 3 3 {0 September} 4 4 5 + - {{!//blog/2025/09/page-"caching-opam-solutions2"}Caching opam solutions - part 2} 6 + - {{!//blog/2025/09/page-"odoc-bugs"}Odoc bugs} 7 + - {{!//blog/2025/09/page-"caching-opam-solutions"}Caching opam solutions} 8 + - {{!//blog/2025/09/page-"build-ids-for-day10"}Build IDs for Day10} 9 + - {{!//blog/2025/09/page-"giving-hub-cl-an-upgrade"}Giving hub.cl an upgrade}
+1
site/blog/2025/11/index.mld
··· 2 2 3 3 {0 November} 4 4 5 + - {{!//blog/2025/11/page-"foundations-of-computer-science"}Foundations of Computer Science}
+2
site/blog/2025/12/index.mld
··· 2 2 3 3 {0 December} 4 4 5 + - {{!//blog/2025/12/page-"claude-and-dune"}Claude and Dune} 6 + - {{!//blog/2025/12/page-"an-svg-is-all-you-need"}An SVG is all you need}
+2
site/blog/2026/01/index.mld
··· 2 2 3 3 {0 January} 4 4 5 + - {{!//blog/2026/01/page-"weeknotes-2026-04-05"}Weeknotes for weeks 4-5} 6 + - {{!//blog/2026/01/page-"weeknotes-2026-03"}Weeknotes for week 3}
+2
site/blog/2026/02/index.mld
··· 2 2 3 3 {0 February} 4 4 5 + - {{!//blog/2026/02/page-"weeknotes-2026-08"}Weeknotes weeks 7-8} 6 + - {{!//blog/2026/02/page-"weeknotes-2026-06"}Weeknotes for week 6}
+4
site/blog/2026/03/index.mld
··· 2 2 3 3 {0 March} 4 4 5 + - {{!//blog/2026/03/page-"weeknotes-2026-12"}Weeknotes 2026 week 12} 6 + - {{!//blog/2026/03/page-"weeknotes-2026-11"}Weeknotes 2026 week 11} 7 + - {{!//blog/2026/03/page-"weeknotes-2026-10"}Weeknotes 2026 week 10} 8 + - {{!//blog/2026/03/page-"weeknotes-2026-09"}Weeknotes 2026 week 9}
+12 -5
site/blog/2026/03/weeknotes-2026-12.mld
··· 10 10 PR. 11 11 12 12 I mentioned {{!//blog/2026/03/page-"weeknotes-2026-11"}last week} that the 13 - TESSERA reprojection was causing issues with the overlay alignment. Here's 14 - a standalone test showing the Zarr-based pipeline — fetching embeddings, 15 - running PCA, and overlaying the result on a Leaflet map. 13 + TESSERA reprojection was causing issues with the overlay alignment. Now the original 14 + loading of the patches was taking ages, so I switched to zarr to be more efficient. 15 + Also, the PCA was slow, so I switched that over to tensorflow.js to use the GPU. 16 + 17 + With these two optimisations in place, it was now a lot quicker to see if the 18 + misalignment was still there. It seemed likely that the issue was translating 19 + between the UTM grid that TESSERA uses and the WGS84 coordinate system that Leaflet.js 20 + is using. It was quite quick to whip up a {{!/tessera-geotessera/Geotessera.Utm.wgs84_to_utm}conversion routine} (click on 'source' to see the gory details!). With that in 21 + place, the overlay now matches up precisely as you can see on the map below. 22 + Be patient while it runs, you'll see the overlay on the map in a few seconds! 16 23 17 24 {@ocaml kind=setup[ 18 25 #require "tessera-zarr-jsoo";; ··· 24 31 (* Load fzstd (Zstd decompressor) and TensorFlow.js *) 25 32 let () = 26 33 let open Js_of_ocaml in 27 - let import url = Js.Unsafe.fun_call 34 + let import url : unit = Js.Unsafe.fun_call 28 35 (Js.Unsafe.get Js.Unsafe.global (Js.string "importScripts")) 29 36 [| Js.Unsafe.inject (Js.string url) |] in 30 37 import "https://cdn.jsdelivr.net/npm/fzstd@0.1.1/umd/index.js"; ··· 84 91 Tessera_zarr.fetch_region ~progress ~store bbox in 85 92 Widget.update ~id:"status" 86 93 (status_view (Printf.sprintf "Fetched %d×%d. Downsampling..." h_full w_full)); 87 - let (mat, h, w) = downsample mat_full ~h:h_full ~w:w_full ~max_pixels:200_000 in 94 + let (mat, h, w) = downsample mat_full ~h:h_full ~w:w_full ~max_pixels:500_000 in 88 95 let bounds = Leaflet_map.{ 89 96 south = geo_bounds.Geotessera.min_lat; 90 97 north = geo_bounds.Geotessera.max_lat;