commits
- Rename `effect` variable to `eff` in editor.ml (reserved keyword in 5.4)
- Add `first_crc` cppo-guarded helper for cmi_crcs API difference
(Import_info.t array in oxcaml vs (string * Digest.t option) list in 5.4)
- Remove `source_rendering` from dune-workspace (not in upstream dune/odoc)
All extension packages, tessera, zarr, and odoc now build with both
oxcaml 5.2.0+ox and standard OCaml 5.4.1. The js_top_worker library
compiles on both; linking requires matching merlin-lib.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three fixes for "Position N is out of range for changeset" errors:
1. js_top_worker: clamp output_at loc to input length — the ";;"
appended for parsing made pos_cnum extend past the original source
2. x-ocaml/editor: clamp decoration positions against CM document
length (Text.length) not OCaml String.length — they differ for
non-ASCII text (UTF-16 vs bytes). Also combine doc replacement +
decoration clear into a single transaction in set_source, and
read actual CM doc in build_range_set
3. jsoo-code-mirror/decoration: defensive safe_map that catches
JS RangeError in RangeSet.map and returns empty
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The js_top_worker-widget-leaflet library is wrapped, so #require
only registers Widget_leaflet as a toplevel module. Leaflet_map
is a submodule and needs open Widget_leaflet to be in scope.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1c5e32e0 Fix odoc build with OCaml 5.4.1: Data_types module migration
c31be687 Site updates
c5f2c361 Fix odoc doc build warnings: Tsig_include annotation, onnxrt refs, fatal warnings
68bbb7b2 Fix PPX spurious source links and same-module value linking in odoc
e7c7d887 Merge commit '07bc534031770950e35905270cc6916f76009aa0'
e9b5ed8a Constrain lwt < 6.1.0 (6.1.1 incompatible with oxcaml)
e9636bef Add new test and blog post
b66e7262 Alternative, simpler fix
git-subtree-dir: odoc
git-subtree-split: 1c5e32e0e12f06603becf9b1394f95ce7fc5409a
When a cell contains multiple let bindings without ;; separators,
the OCaml toplevel groups them into a single Ptop_def with multiple
structure items. The output_at loc was using the first item's
pstr_loc, placing all val outputs after the first definition.
Now uses the last item's loc so output appears after the final
definition in the group.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dot extension: Replace per-diagram Js_inline scripts with a single
Js_url support file (dot-init.js) using MutationObserver pattern.
Store DOT source in <script type="text/dot"> elements to avoid
escaping issues. Fixes SPA navigation rendering.
Merlin config: Add stdlib path to build_path so dynamically loaded
packages (e.g. cmdliner via #require) resolve in merlin's type
checker. Previously only stdlib was set, causing red squiggly
errors on library references despite code compiling fine.
Widget_leaflet: Re-export Leaflet_map module from Widget_leaflet
so it's part of the public API. Add leaflet widget demo page.
Interactive extension demos: Move broken demos to .notyet:
- demo2_v2/v3: fake v1/v2 distinction (same cmdliner version)
- demo3_oxcaml: comprehensions extension disabled in compiler
- demo4_crossorigin: requires jon.ludl.am infrastructure
- demo5_multiverse: requires localhost:9090
- demo6/demo7: porting workshops need work
Fix demo_map and demo_widgets: add @x-ocaml.universe and
@x-ocaml.worker tags pointing to /_opam.
Simplify build-site.sh: remove redundant v2/v3 universe builds.
Sidebar: Add odoc-md to 'odoc Core' package group.
Scrollycode: Remove theme references from docs, align titles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-site.sh: Use dune-built worker.js (--no-worker + cp) so the
worker always matches the source tree. Previously jtw compiled against
the installed js_top_worker-web package via ocamlfind, which could be
stale. Also make @site and @doc steps fail on errors instead of
swallowing them.
js_top_worker: Add blank_directives to strip #require lines from source
before sending to merlin. The pre_source context prepends previous cells'
source (including #require directives) which causes Menhir's incremental
parser to throw force_reduction errors.
x-ocaml: Add bounds checking to Typed_enclosings response in
merlin_ext.ml, matching the existing pattern for Errors. Prevents
CodeMirror RangeError when merlin returns positions outside the cell's
document range.
odoc-mermaid-extension: Fix SPA navigation by replacing Js_inline init
script with Js_url support file using MutationObserver pattern. The old
startOnLoad:true approach only worked on full page loads; now mermaid.run()
is called explicitly whenever new pre.mermaid elements appear in the DOM.
site/dune.inc: Regenerated with --warn-error on odoc compile/link/
html-generate, and -L/-P flags for library/package cross-references
from @doc build output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Leaflet_map provides a type-safe OCaml interface to the Leaflet widget:
- Leaflet_map.create: typed config (center, zoom, height) + typed callbacks
(on_click receives latlng, on_bbox_drawn receives bounds)
- Leaflet_map.add_image_overlay: typed bounds + url + opacity
- Leaflet_map.add_marker: typed latlng + optional color/label
- All JSON serialization hidden inside the wrapper
The notebook no longer uses raw Widget.command/Scanf.sscanf for map
interaction. Compare:
Before: Widget.command ~id "addImageOverlay" (Printf.sprintf {|{...}|} ...)
After: Leaflet_map.add_image_overlay map ~url ~bounds ~opacity:0.7 ()
Before: Scanf.sscanf json {|{"lat":%f,"lng":%f}|} (fun a b -> ...)
After: on_click:(fun pt -> ... pt.lat ... pt.lng ...)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The GeoTessera embedding tiles have pixel grids in UTM projection, but the
notebook was overlaying them as if they were on a regular lat/lng grid. This
caused ~3-6% east-west distortion at mid-latitudes (e.g. ~440m at 52N).
- Add pure-OCaml UTM projection module (utm.ml) with WGS84 ellipsoid
forward/inverse transforms
- Add reproject_tile function that resamples each tile from its native UTM
grid onto a regular WGS84 grid using nearest-neighbor interpolation
- Mosaic now reprojects all tiles before assembly, matching the Python
reference implementation (ucam-eo/tessera-interactive-map) which uses
rasterio.warp.reproject for the same purpose
- Return computed WGS84 bounds from fetch_mosaic_sync instead of requiring
callers to hardcode snap ± 0.05
- Fix jtw relativize_or_fallback for dune exec paths (dynamic_cmis.json
generation was silently skipped for locally-built packages)
- Consolidate deploy-site.sh as thin wrapper around build-site.sh
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4095c1af Constrain lwt < 6.1.0 (6.1.1 incompatible with oxcaml)
47c161ce Minor updates
1f56d069 Better source rendering
56c34e9a test: update json_expansion_with_sources test for pos_of_loc fix
825790c5 feat: add open/include tracking to source linking
77fbf3d4 feat: add record field references to source linking
dd8d0182 feat: add constructor references to source linking
8e072559 feat: re-enable documentation links from source code
21091826 fix: correct pos_of_loc end position in source annotations
git-subtree-dir: odoc
git-subtree-split: 4095c1afe288e6bf73c4ba8006cbc67d543913a7
lwt 6.1.1 fails to compile on oxcaml 5.2.0+ox due to type changes
in Unix.recv/send. The ox repo provides lwt.6.0.0+ox which works.
Adding an upper bound ensures the solver picks the right version.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When multiple findlib packages share a single directory (like
compiler-libs.common, .bytecomp, .optcomp, .toplevel), the old
directory-wide preload check would see all CMIs from all packages
and incorrectly report "partially loaded" — then try to reload
archives that were already linked, crashing with "file already exists".
Fix: use ocamlobjinfo at build time to extract per-CMA unit lists,
embed them in dynamic_cmis.json, and check only the relevant archive's
units at runtime before deciding whether to load its .cma.js.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5629c8d5 Add mdx as test dependency in odoc.opam
git-subtree-dir: odoc
git-subtree-split: 5629c8d594f948bfa9098e39d20afbc53f2f3ffb
265e6296 Fix scrollycode SPA navigation bug and add extensions authoring guide
21799997 WIP: site redesign, odoc extension API updates, and new content
e410f6cf jon-shell css: reduce body font to 16px and set x-ocaml editor font size
fc897c09 Add odoc-standalone package scaffolding
git-subtree-dir: odoc
git-subtree-split: 265e6296d2a506eff23ddb8f497a8cb379f7a866
New blog posts (monopam-madness, open-source-and-ai, weeknotes-2026-10),
notebook showcase with card layout and screenshots, Atom feed generator,
foundations notebook fixes, ONNX test improvements, widget interaction
tests, deploy script updates for oxcaml switch, and .gitignore for
build artifacts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The oxcaml compiler changed cmi_crcs from (string * Digest.t option) list
to Import_info.t array, and Env.crc_of_unit now takes Compilation_unit.Name.t
instead of string. Update all three call sites accordingly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Commands sent before Leaflet finishes loading were silently dropped.
Now they are queued and replayed once the map initializes. This fixes
enableBboxDraw being lost when called immediately after display_managed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71fe7ccd3 Merge branch 'point-release-fixes' of https://github.com/jonludlam/odoc
4d53f50da Make all warnings respect --warn-error
d1f796f14 Add test showing --warn-error doesn't affect unresolved references
d6c8ece57 Don't resolve imports without digests during compile
18adbf89b Add test for no-alias-deps import resolution bug
c3f0f46ee Update for dune 3.21
git-subtree-dir: odoc
git-subtree-split: 71fe7ccd36eee7f244a355653e10de197d6bcb94
Tests addMarker, clearMarkers, addImageOverlay, removeImageOverlay
commands in a standalone HTML page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New commands:
- enableBboxDraw: custom rectangle drawing with bbox_drawn event
- addImageOverlay/removeImageOverlay: display data URL images on map
- addMarker/clearMarkers: circle markers with labels
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tests addMarker, clearMarkers, addImageOverlay, removeImageOverlay
commands in a standalone HTML page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New commands:
- enableBboxDraw: custom rectangle drawing with bbox_drawn event
- addImageOverlay/removeImageOverlay: display data URL images on map
- addMarker/clearMarkers: circle markers with labels
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tests PNG encoding and data URL generation in a web worker.
Verified: 4x4 RGBA image encodes to valid PNG, renders as <img>.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tests run in a web worker (sync XHR requires worker context).
Fetches a real scales.npy from dl2.geotessera.org, parses it,
and verifies the shape and data values.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of requiring every .mld file to specify @x-ocaml.universe and
@x-ocaml.worker tags individually, configure the default universe path
once in dune-workspace (--config x-ocaml.universe=/_opam). The shell
emits <meta> tags from config values, and per-page @x-ocaml tags can
still override them.
Changes:
- dune-workspace: add --config x-ocaml.universe=/_opam to html_flags
- gen_rules.ml: pass --config to odoc html-generate for @site build
- odoc_jon_shell.ml: emit <meta> tags from x-ocaml.* config values
- odoc generator.ml: pass config to shell page_creator
- interactive_extension.ml: upsert meta tags (update existing or create)
- x_ocaml.ml: infer jtw backend from x-ocaml-universe meta tag
- Remove @x-ocaml.universe/@x-ocaml.worker from 14 .mld files using
the default /_opam universe
- deploy-site.sh: add dune install x-ocaml, chmod fix, widget-leaflet
- findlibish.ml: module detection fallback via jsoo runtime
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Widen sidebar from 200px to 260px with updated max-width calculations
- Collapse top two wrapper levels so content aligns with header
- Add border-left indentation guides on nested lists
- Replace original toggle arrows with larger inline chevrons (1em, rotate on expand)
- Separate click targets: chevrons toggle expand/collapse, links navigate
- Align childless items with toggle items via 20px margin-left
- Fix CSS cascade where .jon-shell-main ul overrode sidebar ul padding
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add browser test that compiles OCaml to JS via js_of_ocaml and verifies
fetch, npy parsing, and mosaic assembly work in a real browser.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of requiring every .mld file to specify @x-ocaml.universe and
@x-ocaml.worker tags individually, configure the default universe path
once in dune-workspace (--config x-ocaml.universe=/_opam). The shell
emits <meta> tags from config values, and per-page @x-ocaml tags can
still override them.
Changes:
- dune-workspace: add --config x-ocaml.universe=/_opam to html_flags
- gen_rules.ml: pass --config to odoc html-generate for @site build
- odoc_jon_shell.ml: emit <meta> tags from x-ocaml.* config values
- odoc generator.ml: pass config to shell page_creator
- interactive_extension.ml: upsert meta tags (update existing or create)
- x_ocaml.ml: infer jtw backend from x-ocaml-universe meta tag
- Remove @x-ocaml.universe/@x-ocaml.worker from 14 .mld files using
the default /_opam universe
- deploy-site.sh: add dune install x-ocaml, chmod fix, widget-leaflet
- findlibish.ml: module detection fallback via jsoo runtime
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Generate tessera-viz.opam from dune-project. All odoc documentation
is in the .mli with section headers and docstrings for every public
type and function.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add color_of_hex for parsing hex color strings and classification_to_rgba
for mapping integer class predictions to colored RGBA pixels. Unknown
classes render as black. Add unit arg to resolve optional alpha parameter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Convert 3-component PCA matrix to false-color RGBA image with
per-component percentile clipping and 0-255 scaling. Optional args
moved before positional to satisfy OCaml's optional-arg resolution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add the tessera-viz library skeleton with dune-project, .mli interface,
and a working percentile function with linear interpolation. Other API
functions are stubbed with failwith for TDD iteration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Generate opam file from dune-project. All 15 tests pass across grid
math, dequantization, mosaic, and fetch_mosaic_sync.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add end-to-end test for fetch_mosaic_sync using mock fetch function
with numpy fixture files. Verifies the full pipeline: bbox -> tile
enumeration -> fetch -> dequantize -> mosaic -> correct output values.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add mosaic tests verifying horizontal and vertical tile assembly.
North tiles appear at top (row 0), south at bottom. Confirms correct
grid position calculation and data placement.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add dequantization test with numpy fixtures (2x3x4 int8 embeddings,
2x3 float32 scales). Verifies correct int8 * scale multiplication
and output matrix dimensions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add new tessera-geotessera library with dune project structure, public
API (.mli), and grid math implementation (snap_to_grid, tiles_for_bbox,
tile_name, URL construction). Includes full implementations of
dequantize, mosaic, and fetch_mosaic_sync. Grid math tests all pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename `effect` variable to `eff` in editor.ml (reserved keyword in 5.4)
- Add `first_crc` cppo-guarded helper for cmi_crcs API difference
(Import_info.t array in oxcaml vs (string * Digest.t option) list in 5.4)
- Remove `source_rendering` from dune-workspace (not in upstream dune/odoc)
All extension packages, tessera, zarr, and odoc now build with both
oxcaml 5.2.0+ox and standard OCaml 5.4.1. The js_top_worker library
compiles on both; linking requires matching merlin-lib.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three fixes for "Position N is out of range for changeset" errors:
1. js_top_worker: clamp output_at loc to input length — the ";;"
appended for parsing made pos_cnum extend past the original source
2. x-ocaml/editor: clamp decoration positions against CM document
length (Text.length) not OCaml String.length — they differ for
non-ASCII text (UTF-16 vs bytes). Also combine doc replacement +
decoration clear into a single transaction in set_source, and
read actual CM doc in build_range_set
3. jsoo-code-mirror/decoration: defensive safe_map that catches
JS RangeError in RangeSet.map and returns empty
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1c5e32e0 Fix odoc build with OCaml 5.4.1: Data_types module migration
c31be687 Site updates
c5f2c361 Fix odoc doc build warnings: Tsig_include annotation, onnxrt refs, fatal warnings
68bbb7b2 Fix PPX spurious source links and same-module value linking in odoc
e7c7d887 Merge commit '07bc534031770950e35905270cc6916f76009aa0'
e9b5ed8a Constrain lwt < 6.1.0 (6.1.1 incompatible with oxcaml)
e9636bef Add new test and blog post
b66e7262 Alternative, simpler fix
git-subtree-dir: odoc
git-subtree-split: 1c5e32e0e12f06603becf9b1394f95ce7fc5409a
When a cell contains multiple let bindings without ;; separators,
the OCaml toplevel groups them into a single Ptop_def with multiple
structure items. The output_at loc was using the first item's
pstr_loc, placing all val outputs after the first definition.
Now uses the last item's loc so output appears after the final
definition in the group.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dot extension: Replace per-diagram Js_inline scripts with a single
Js_url support file (dot-init.js) using MutationObserver pattern.
Store DOT source in <script type="text/dot"> elements to avoid
escaping issues. Fixes SPA navigation rendering.
Merlin config: Add stdlib path to build_path so dynamically loaded
packages (e.g. cmdliner via #require) resolve in merlin's type
checker. Previously only stdlib was set, causing red squiggly
errors on library references despite code compiling fine.
Widget_leaflet: Re-export Leaflet_map module from Widget_leaflet
so it's part of the public API. Add leaflet widget demo page.
Interactive extension demos: Move broken demos to .notyet:
- demo2_v2/v3: fake v1/v2 distinction (same cmdliner version)
- demo3_oxcaml: comprehensions extension disabled in compiler
- demo4_crossorigin: requires jon.ludl.am infrastructure
- demo5_multiverse: requires localhost:9090
- demo6/demo7: porting workshops need work
Fix demo_map and demo_widgets: add @x-ocaml.universe and
@x-ocaml.worker tags pointing to /_opam.
Simplify build-site.sh: remove redundant v2/v3 universe builds.
Sidebar: Add odoc-md to 'odoc Core' package group.
Scrollycode: Remove theme references from docs, align titles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-site.sh: Use dune-built worker.js (--no-worker + cp) so the
worker always matches the source tree. Previously jtw compiled against
the installed js_top_worker-web package via ocamlfind, which could be
stale. Also make @site and @doc steps fail on errors instead of
swallowing them.
js_top_worker: Add blank_directives to strip #require lines from source
before sending to merlin. The pre_source context prepends previous cells'
source (including #require directives) which causes Menhir's incremental
parser to throw force_reduction errors.
x-ocaml: Add bounds checking to Typed_enclosings response in
merlin_ext.ml, matching the existing pattern for Errors. Prevents
CodeMirror RangeError when merlin returns positions outside the cell's
document range.
odoc-mermaid-extension: Fix SPA navigation by replacing Js_inline init
script with Js_url support file using MutationObserver pattern. The old
startOnLoad:true approach only worked on full page loads; now mermaid.run()
is called explicitly whenever new pre.mermaid elements appear in the DOM.
site/dune.inc: Regenerated with --warn-error on odoc compile/link/
html-generate, and -L/-P flags for library/package cross-references
from @doc build output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Leaflet_map provides a type-safe OCaml interface to the Leaflet widget:
- Leaflet_map.create: typed config (center, zoom, height) + typed callbacks
(on_click receives latlng, on_bbox_drawn receives bounds)
- Leaflet_map.add_image_overlay: typed bounds + url + opacity
- Leaflet_map.add_marker: typed latlng + optional color/label
- All JSON serialization hidden inside the wrapper
The notebook no longer uses raw Widget.command/Scanf.sscanf for map
interaction. Compare:
Before: Widget.command ~id "addImageOverlay" (Printf.sprintf {|{...}|} ...)
After: Leaflet_map.add_image_overlay map ~url ~bounds ~opacity:0.7 ()
Before: Scanf.sscanf json {|{"lat":%f,"lng":%f}|} (fun a b -> ...)
After: on_click:(fun pt -> ... pt.lat ... pt.lng ...)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The GeoTessera embedding tiles have pixel grids in UTM projection, but the
notebook was overlaying them as if they were on a regular lat/lng grid. This
caused ~3-6% east-west distortion at mid-latitudes (e.g. ~440m at 52N).
- Add pure-OCaml UTM projection module (utm.ml) with WGS84 ellipsoid
forward/inverse transforms
- Add reproject_tile function that resamples each tile from its native UTM
grid onto a regular WGS84 grid using nearest-neighbor interpolation
- Mosaic now reprojects all tiles before assembly, matching the Python
reference implementation (ucam-eo/tessera-interactive-map) which uses
rasterio.warp.reproject for the same purpose
- Return computed WGS84 bounds from fetch_mosaic_sync instead of requiring
callers to hardcode snap ± 0.05
- Fix jtw relativize_or_fallback for dune exec paths (dynamic_cmis.json
generation was silently skipped for locally-built packages)
- Consolidate deploy-site.sh as thin wrapper around build-site.sh
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4095c1af Constrain lwt < 6.1.0 (6.1.1 incompatible with oxcaml)
47c161ce Minor updates
1f56d069 Better source rendering
56c34e9a test: update json_expansion_with_sources test for pos_of_loc fix
825790c5 feat: add open/include tracking to source linking
77fbf3d4 feat: add record field references to source linking
dd8d0182 feat: add constructor references to source linking
8e072559 feat: re-enable documentation links from source code
21091826 fix: correct pos_of_loc end position in source annotations
git-subtree-dir: odoc
git-subtree-split: 4095c1afe288e6bf73c4ba8006cbc67d543913a7
When multiple findlib packages share a single directory (like
compiler-libs.common, .bytecomp, .optcomp, .toplevel), the old
directory-wide preload check would see all CMIs from all packages
and incorrectly report "partially loaded" — then try to reload
archives that were already linked, crashing with "file already exists".
Fix: use ocamlobjinfo at build time to extract per-CMA unit lists,
embed them in dynamic_cmis.json, and check only the relevant archive's
units at runtime before deciding whether to load its .cma.js.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
265e6296 Fix scrollycode SPA navigation bug and add extensions authoring guide
21799997 WIP: site redesign, odoc extension API updates, and new content
e410f6cf jon-shell css: reduce body font to 16px and set x-ocaml editor font size
fc897c09 Add odoc-standalone package scaffolding
git-subtree-dir: odoc
git-subtree-split: 265e6296d2a506eff23ddb8f497a8cb379f7a866
New blog posts (monopam-madness, open-source-and-ai, weeknotes-2026-10),
notebook showcase with card layout and screenshots, Atom feed generator,
foundations notebook fixes, ONNX test improvements, widget interaction
tests, deploy script updates for oxcaml switch, and .gitignore for
build artifacts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71fe7ccd3 Merge branch 'point-release-fixes' of https://github.com/jonludlam/odoc
4d53f50da Make all warnings respect --warn-error
d1f796f14 Add test showing --warn-error doesn't affect unresolved references
d6c8ece57 Don't resolve imports without digests during compile
18adbf89b Add test for no-alias-deps import resolution bug
c3f0f46ee Update for dune 3.21
git-subtree-dir: odoc
git-subtree-split: 71fe7ccd36eee7f244a355653e10de197d6bcb94
Instead of requiring every .mld file to specify @x-ocaml.universe and
@x-ocaml.worker tags individually, configure the default universe path
once in dune-workspace (--config x-ocaml.universe=/_opam). The shell
emits <meta> tags from config values, and per-page @x-ocaml tags can
still override them.
Changes:
- dune-workspace: add --config x-ocaml.universe=/_opam to html_flags
- gen_rules.ml: pass --config to odoc html-generate for @site build
- odoc_jon_shell.ml: emit <meta> tags from x-ocaml.* config values
- odoc generator.ml: pass config to shell page_creator
- interactive_extension.ml: upsert meta tags (update existing or create)
- x_ocaml.ml: infer jtw backend from x-ocaml-universe meta tag
- Remove @x-ocaml.universe/@x-ocaml.worker from 14 .mld files using
the default /_opam universe
- deploy-site.sh: add dune install x-ocaml, chmod fix, widget-leaflet
- findlibish.ml: module detection fallback via jsoo runtime
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Widen sidebar from 200px to 260px with updated max-width calculations
- Collapse top two wrapper levels so content aligns with header
- Add border-left indentation guides on nested lists
- Replace original toggle arrows with larger inline chevrons (1em, rotate on expand)
- Separate click targets: chevrons toggle expand/collapse, links navigate
- Align childless items with toggle items via 20px margin-left
- Fix CSS cascade where .jon-shell-main ul overrode sidebar ul padding
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of requiring every .mld file to specify @x-ocaml.universe and
@x-ocaml.worker tags individually, configure the default universe path
once in dune-workspace (--config x-ocaml.universe=/_opam). The shell
emits <meta> tags from config values, and per-page @x-ocaml tags can
still override them.
Changes:
- dune-workspace: add --config x-ocaml.universe=/_opam to html_flags
- gen_rules.ml: pass --config to odoc html-generate for @site build
- odoc_jon_shell.ml: emit <meta> tags from x-ocaml.* config values
- odoc generator.ml: pass config to shell page_creator
- interactive_extension.ml: upsert meta tags (update existing or create)
- x_ocaml.ml: infer jtw backend from x-ocaml-universe meta tag
- Remove @x-ocaml.universe/@x-ocaml.worker from 14 .mld files using
the default /_opam universe
- deploy-site.sh: add dune install x-ocaml, chmod fix, widget-leaflet
- findlibish.ml: module detection fallback via jsoo runtime
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add new tessera-geotessera library with dune project structure, public
API (.mli), and grid math implementation (snap_to_grid, tiles_for_bbox,
tile_name, URL construction). Includes full implementations of
dequantize, mosaic, and fetch_mosaic_sync. Grid math tests all pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>