My aggregated monorepo of OCaml code, automaintained
0
fork

Configure Feed

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

Add notebooks showcase page with card-style layout

Replace the placeholder notebooks/index.mld with a card grid featuring
screenshot thumbnails of the Foundations and OxCaml notebook pages,
category labels, descriptions, and hover effects. Responsive layout
collapses to single column on mobile.

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

+657 -5
+565 -4
site/dune.inc
··· 49 49 blog/2026/02/weeknotes-2026-08.mld 50 50 blog/2026/03/index.mld 51 51 blog/2026/03/weeknotes-2026-09.mld 52 + blog/2026/03/weeknotes-2026-10.mld 52 53 blog/2026/index.mld 53 54 blog/index.mld 54 55 drafts/index.mld ··· 69 70 notebooks/interactive_map.mld 70 71 notebooks/oxcaml/local.mld 71 72 projects/index.mld 72 - reference/index.mld) 73 + reference/index.mld 74 + blog/2025/05/alice.jpg 75 + blog/2025/05/amy.jpg 76 + blog/2025/05/emilio.jpg 77 + blog/2025/05/frank.jpg 78 + blog/2025/05/hattie.jpg 79 + blog/2025/05/marta.jpg 80 + blog/2025/05/melissa.jpg 81 + blog/2025/05/orlando.jpg 82 + blog/2025/05/ruari.jpg 83 + blog/2025/05/sadiq.jpg 84 + blog/2025/05/sebastian.jpg 85 + blog/2025/05/simon.jpg 86 + blog/2025/05/simond.jpg 87 + blog/2025/09/examination_map_histogram.png 88 + blog/2025/09/examination_map_histogram.svg 89 + blog/2025/12/fungus.svg 90 + blog/2026/03/mapdemo.mov 91 + blog/2026/03/search.png) 73 92 (action 74 93 (progn 75 94 (run ··· 451 470 (run 452 471 odoc 453 472 compile 473 + blog/2026/03/weeknotes-2026-10.mld 474 + --output-dir 475 + _odoc 476 + --parent-id 477 + blog/2026/03) 478 + (run 479 + odoc 480 + compile 454 481 blog/2026/index.mld 455 482 --output-dir 456 483 _odoc ··· 597 624 reference) 598 625 (run 599 626 odoc 627 + compile-asset 628 + --name 629 + alice.jpg 630 + --output-dir 631 + _odoc 632 + --parent-id 633 + blog/2025/05) 634 + (run 635 + odoc 636 + compile-asset 637 + --name 638 + amy.jpg 639 + --output-dir 640 + _odoc 641 + --parent-id 642 + blog/2025/05) 643 + (run 644 + odoc 645 + compile-asset 646 + --name 647 + emilio.jpg 648 + --output-dir 649 + _odoc 650 + --parent-id 651 + blog/2025/05) 652 + (run 653 + odoc 654 + compile-asset 655 + --name 656 + frank.jpg 657 + --output-dir 658 + _odoc 659 + --parent-id 660 + blog/2025/05) 661 + (run 662 + odoc 663 + compile-asset 664 + --name 665 + hattie.jpg 666 + --output-dir 667 + _odoc 668 + --parent-id 669 + blog/2025/05) 670 + (run 671 + odoc 672 + compile-asset 673 + --name 674 + marta.jpg 675 + --output-dir 676 + _odoc 677 + --parent-id 678 + blog/2025/05) 679 + (run 680 + odoc 681 + compile-asset 682 + --name 683 + melissa.jpg 684 + --output-dir 685 + _odoc 686 + --parent-id 687 + blog/2025/05) 688 + (run 689 + odoc 690 + compile-asset 691 + --name 692 + orlando.jpg 693 + --output-dir 694 + _odoc 695 + --parent-id 696 + blog/2025/05) 697 + (run 698 + odoc 699 + compile-asset 700 + --name 701 + ruari.jpg 702 + --output-dir 703 + _odoc 704 + --parent-id 705 + blog/2025/05) 706 + (run 707 + odoc 708 + compile-asset 709 + --name 710 + sadiq.jpg 711 + --output-dir 712 + _odoc 713 + --parent-id 714 + blog/2025/05) 715 + (run 716 + odoc 717 + compile-asset 718 + --name 719 + sebastian.jpg 720 + --output-dir 721 + _odoc 722 + --parent-id 723 + blog/2025/05) 724 + (run 725 + odoc 726 + compile-asset 727 + --name 728 + simon.jpg 729 + --output-dir 730 + _odoc 731 + --parent-id 732 + blog/2025/05) 733 + (run 734 + odoc 735 + compile-asset 736 + --name 737 + simond.jpg 738 + --output-dir 739 + _odoc 740 + --parent-id 741 + blog/2025/05) 742 + (run 743 + odoc 744 + compile-asset 745 + --name 746 + examination_map_histogram.png 747 + --output-dir 748 + _odoc 749 + --parent-id 750 + blog/2025/09) 751 + (run 752 + odoc 753 + compile-asset 754 + --name 755 + examination_map_histogram.svg 756 + --output-dir 757 + _odoc 758 + --parent-id 759 + blog/2025/09) 760 + (run 761 + odoc 762 + compile-asset 763 + --name 764 + fungus.svg 765 + --output-dir 766 + _odoc 767 + --parent-id 768 + blog/2025/12) 769 + (run 770 + odoc 771 + compile-asset 772 + --name 773 + mapdemo.mov 774 + --output-dir 775 + _odoc 776 + --parent-id 777 + blog/2026/03) 778 + (run 779 + odoc 780 + compile-asset 781 + --name 782 + search.png 783 + --output-dir 784 + _odoc 785 + --parent-id 786 + blog/2026/03) 787 + (run 788 + odoc 600 789 link 601 790 _odoc/blog/2025/03/page-code-block-metadata.odoc 602 791 -P ··· 974 1163 (run 975 1164 odoc 976 1165 link 1166 + _odoc/blog/2026/03/page-weeknotes-2026-10.odoc 1167 + -P 1168 + site:_odoc 1169 + -o 1170 + _odoc/blog/2026/03/page-weeknotes-2026-10.odocl) 1171 + (run 1172 + odoc 1173 + link 977 1174 _odoc/blog/2026/page-index.odoc 978 1175 -P 979 1176 site:_odoc ··· 1141 1338 _odoc/reference/page-index.odocl) 1142 1339 (run 1143 1340 odoc 1341 + link 1342 + _odoc/blog/2025/05/asset-alice.jpg.odoc 1343 + -P 1344 + site:_odoc 1345 + -o 1346 + _odoc/blog/2025/05/asset-alice.jpg.odocl) 1347 + (run 1348 + odoc 1349 + link 1350 + _odoc/blog/2025/05/asset-amy.jpg.odoc 1351 + -P 1352 + site:_odoc 1353 + -o 1354 + _odoc/blog/2025/05/asset-amy.jpg.odocl) 1355 + (run 1356 + odoc 1357 + link 1358 + _odoc/blog/2025/05/asset-emilio.jpg.odoc 1359 + -P 1360 + site:_odoc 1361 + -o 1362 + _odoc/blog/2025/05/asset-emilio.jpg.odocl) 1363 + (run 1364 + odoc 1365 + link 1366 + _odoc/blog/2025/05/asset-frank.jpg.odoc 1367 + -P 1368 + site:_odoc 1369 + -o 1370 + _odoc/blog/2025/05/asset-frank.jpg.odocl) 1371 + (run 1372 + odoc 1373 + link 1374 + _odoc/blog/2025/05/asset-hattie.jpg.odoc 1375 + -P 1376 + site:_odoc 1377 + -o 1378 + _odoc/blog/2025/05/asset-hattie.jpg.odocl) 1379 + (run 1380 + odoc 1381 + link 1382 + _odoc/blog/2025/05/asset-marta.jpg.odoc 1383 + -P 1384 + site:_odoc 1385 + -o 1386 + _odoc/blog/2025/05/asset-marta.jpg.odocl) 1387 + (run 1388 + odoc 1389 + link 1390 + _odoc/blog/2025/05/asset-melissa.jpg.odoc 1391 + -P 1392 + site:_odoc 1393 + -o 1394 + _odoc/blog/2025/05/asset-melissa.jpg.odocl) 1395 + (run 1396 + odoc 1397 + link 1398 + _odoc/blog/2025/05/asset-orlando.jpg.odoc 1399 + -P 1400 + site:_odoc 1401 + -o 1402 + _odoc/blog/2025/05/asset-orlando.jpg.odocl) 1403 + (run 1404 + odoc 1405 + link 1406 + _odoc/blog/2025/05/asset-ruari.jpg.odoc 1407 + -P 1408 + site:_odoc 1409 + -o 1410 + _odoc/blog/2025/05/asset-ruari.jpg.odocl) 1411 + (run 1412 + odoc 1413 + link 1414 + _odoc/blog/2025/05/asset-sadiq.jpg.odoc 1415 + -P 1416 + site:_odoc 1417 + -o 1418 + _odoc/blog/2025/05/asset-sadiq.jpg.odocl) 1419 + (run 1420 + odoc 1421 + link 1422 + _odoc/blog/2025/05/asset-sebastian.jpg.odoc 1423 + -P 1424 + site:_odoc 1425 + -o 1426 + _odoc/blog/2025/05/asset-sebastian.jpg.odocl) 1427 + (run 1428 + odoc 1429 + link 1430 + _odoc/blog/2025/05/asset-simon.jpg.odoc 1431 + -P 1432 + site:_odoc 1433 + -o 1434 + _odoc/blog/2025/05/asset-simon.jpg.odocl) 1435 + (run 1436 + odoc 1437 + link 1438 + _odoc/blog/2025/05/asset-simond.jpg.odoc 1439 + -P 1440 + site:_odoc 1441 + -o 1442 + _odoc/blog/2025/05/asset-simond.jpg.odocl) 1443 + (run 1444 + odoc 1445 + link 1446 + _odoc/blog/2025/09/asset-examination_map_histogram.png.odoc 1447 + -P 1448 + site:_odoc 1449 + -o 1450 + _odoc/blog/2025/09/asset-examination_map_histogram.png.odocl) 1451 + (run 1452 + odoc 1453 + link 1454 + _odoc/blog/2025/09/asset-examination_map_histogram.svg.odoc 1455 + -P 1456 + site:_odoc 1457 + -o 1458 + _odoc/blog/2025/09/asset-examination_map_histogram.svg.odocl) 1459 + (run 1460 + odoc 1461 + link 1462 + _odoc/blog/2025/12/asset-fungus.svg.odoc 1463 + -P 1464 + site:_odoc 1465 + -o 1466 + _odoc/blog/2025/12/asset-fungus.svg.odocl) 1467 + (run 1468 + odoc 1469 + link 1470 + _odoc/blog/2026/03/asset-mapdemo.mov.odoc 1471 + -P 1472 + site:_odoc 1473 + -o 1474 + _odoc/blog/2026/03/asset-mapdemo.mov.odocl) 1475 + (run 1476 + odoc 1477 + link 1478 + _odoc/blog/2026/03/asset-search.png.odoc 1479 + -P 1480 + site:_odoc 1481 + -o 1482 + _odoc/blog/2026/03/asset-search.png.odocl) 1483 + (run 1484 + odoc 1144 1485 compile-index 1145 1486 --root 1146 1487 site:_odoc ··· 1193 1534 _odoc/blog/2026/02/page-weeknotes-2026-08.odocl 1194 1535 _odoc/blog/2026/03/page-index.odocl 1195 1536 _odoc/blog/2026/03/page-weeknotes-2026-09.odocl 1537 + _odoc/blog/2026/03/page-weeknotes-2026-10.odocl 1196 1538 _odoc/blog/2026/page-index.odocl 1197 1539 _odoc/blog/page-index.odocl 1198 1540 _odoc/drafts/page-index.odocl ··· 1272 1614 _odoc/blog/2026/02/page-weeknotes-2026-08.odocl 1273 1615 _odoc/blog/2026/03/page-index.odocl 1274 1616 _odoc/blog/2026/03/page-weeknotes-2026-09.odocl 1617 + _odoc/blog/2026/03/page-weeknotes-2026-10.odocl 1275 1618 _odoc/blog/2026/page-index.odocl 1276 1619 _odoc/blog/page-index.odocl 1277 1620 _odoc/drafts/page-index.odocl ··· 1293 1636 _odoc/notebooks/oxcaml/page-local.odocl 1294 1637 _odoc/projects/page-index.odocl 1295 1638 _odoc/reference/page-index.odocl 1296 - static/assets/jon.jpg) 1639 + _odoc/blog/2025/05/asset-alice.jpg.odocl 1640 + _odoc/blog/2025/05/asset-amy.jpg.odocl 1641 + _odoc/blog/2025/05/asset-emilio.jpg.odocl 1642 + _odoc/blog/2025/05/asset-frank.jpg.odocl 1643 + _odoc/blog/2025/05/asset-hattie.jpg.odocl 1644 + _odoc/blog/2025/05/asset-marta.jpg.odocl 1645 + _odoc/blog/2025/05/asset-melissa.jpg.odocl 1646 + _odoc/blog/2025/05/asset-orlando.jpg.odocl 1647 + _odoc/blog/2025/05/asset-ruari.jpg.odocl 1648 + _odoc/blog/2025/05/asset-sadiq.jpg.odocl 1649 + _odoc/blog/2025/05/asset-sebastian.jpg.odocl 1650 + _odoc/blog/2025/05/asset-simon.jpg.odocl 1651 + _odoc/blog/2025/05/asset-simond.jpg.odocl 1652 + _odoc/blog/2025/09/asset-examination_map_histogram.png.odocl 1653 + _odoc/blog/2025/09/asset-examination_map_histogram.svg.odocl 1654 + _odoc/blog/2025/12/asset-fungus.svg.odocl 1655 + _odoc/blog/2026/03/asset-mapdemo.mov.odocl 1656 + _odoc/blog/2026/03/asset-search.png.odocl 1657 + blog/2025/05/alice.jpg 1658 + blog/2025/05/amy.jpg 1659 + blog/2025/05/emilio.jpg 1660 + blog/2025/05/frank.jpg 1661 + blog/2025/05/hattie.jpg 1662 + blog/2025/05/marta.jpg 1663 + blog/2025/05/melissa.jpg 1664 + blog/2025/05/orlando.jpg 1665 + blog/2025/05/ruari.jpg 1666 + blog/2025/05/sadiq.jpg 1667 + blog/2025/05/sebastian.jpg 1668 + blog/2025/05/simon.jpg 1669 + blog/2025/05/simond.jpg 1670 + blog/2025/09/examination_map_histogram.png 1671 + blog/2025/09/examination_map_histogram.svg 1672 + blog/2025/12/fungus.svg 1673 + blog/2026/03/mapdemo.mov 1674 + blog/2026/03/search.png 1675 + static/assets/jon.jpg 1676 + static/assets/notebook-foundations.png 1677 + static/assets/notebook-oxcaml.png) 1297 1678 (action 1298 1679 (progn 1299 1680 (run ··· 1775 2156 x-ocaml.universe=/_opam 1776 2157 -o 1777 2158 _html 2159 + _odoc/blog/2026/03/page-weeknotes-2026-10.odocl) 2160 + (run 2161 + odoc 2162 + html-generate 2163 + --shell 2164 + jon-shell 2165 + --config 2166 + x-ocaml.universe=/_opam 2167 + -o 2168 + _html 1778 2169 _odoc/blog/2026/page-index.odocl) 1779 2170 (run 1780 2171 odoc ··· 1976 2367 -o 1977 2368 _html 1978 2369 _odoc/reference/page-index.odocl) 2370 + (run 2371 + odoc 2372 + html-generate-asset 2373 + --asset-unit 2374 + _odoc/blog/2025/05/asset-alice.jpg.odocl 2375 + -o 2376 + _html 2377 + blog/2025/05/alice.jpg) 2378 + (run 2379 + odoc 2380 + html-generate-asset 2381 + --asset-unit 2382 + _odoc/blog/2025/05/asset-amy.jpg.odocl 2383 + -o 2384 + _html 2385 + blog/2025/05/amy.jpg) 2386 + (run 2387 + odoc 2388 + html-generate-asset 2389 + --asset-unit 2390 + _odoc/blog/2025/05/asset-emilio.jpg.odocl 2391 + -o 2392 + _html 2393 + blog/2025/05/emilio.jpg) 2394 + (run 2395 + odoc 2396 + html-generate-asset 2397 + --asset-unit 2398 + _odoc/blog/2025/05/asset-frank.jpg.odocl 2399 + -o 2400 + _html 2401 + blog/2025/05/frank.jpg) 2402 + (run 2403 + odoc 2404 + html-generate-asset 2405 + --asset-unit 2406 + _odoc/blog/2025/05/asset-hattie.jpg.odocl 2407 + -o 2408 + _html 2409 + blog/2025/05/hattie.jpg) 2410 + (run 2411 + odoc 2412 + html-generate-asset 2413 + --asset-unit 2414 + _odoc/blog/2025/05/asset-marta.jpg.odocl 2415 + -o 2416 + _html 2417 + blog/2025/05/marta.jpg) 2418 + (run 2419 + odoc 2420 + html-generate-asset 2421 + --asset-unit 2422 + _odoc/blog/2025/05/asset-melissa.jpg.odocl 2423 + -o 2424 + _html 2425 + blog/2025/05/melissa.jpg) 2426 + (run 2427 + odoc 2428 + html-generate-asset 2429 + --asset-unit 2430 + _odoc/blog/2025/05/asset-orlando.jpg.odocl 2431 + -o 2432 + _html 2433 + blog/2025/05/orlando.jpg) 2434 + (run 2435 + odoc 2436 + html-generate-asset 2437 + --asset-unit 2438 + _odoc/blog/2025/05/asset-ruari.jpg.odocl 2439 + -o 2440 + _html 2441 + blog/2025/05/ruari.jpg) 2442 + (run 2443 + odoc 2444 + html-generate-asset 2445 + --asset-unit 2446 + _odoc/blog/2025/05/asset-sadiq.jpg.odocl 2447 + -o 2448 + _html 2449 + blog/2025/05/sadiq.jpg) 2450 + (run 2451 + odoc 2452 + html-generate-asset 2453 + --asset-unit 2454 + _odoc/blog/2025/05/asset-sebastian.jpg.odocl 2455 + -o 2456 + _html 2457 + blog/2025/05/sebastian.jpg) 2458 + (run 2459 + odoc 2460 + html-generate-asset 2461 + --asset-unit 2462 + _odoc/blog/2025/05/asset-simon.jpg.odocl 2463 + -o 2464 + _html 2465 + blog/2025/05/simon.jpg) 2466 + (run 2467 + odoc 2468 + html-generate-asset 2469 + --asset-unit 2470 + _odoc/blog/2025/05/asset-simond.jpg.odocl 2471 + -o 2472 + _html 2473 + blog/2025/05/simond.jpg) 2474 + (run 2475 + odoc 2476 + html-generate-asset 2477 + --asset-unit 2478 + _odoc/blog/2025/09/asset-examination_map_histogram.png.odocl 2479 + -o 2480 + _html 2481 + blog/2025/09/examination_map_histogram.png) 2482 + (run 2483 + odoc 2484 + html-generate-asset 2485 + --asset-unit 2486 + _odoc/blog/2025/09/asset-examination_map_histogram.svg.odocl 2487 + -o 2488 + _html 2489 + blog/2025/09/examination_map_histogram.svg) 2490 + (run 2491 + odoc 2492 + html-generate-asset 2493 + --asset-unit 2494 + _odoc/blog/2025/12/asset-fungus.svg.odocl 2495 + -o 2496 + _html 2497 + blog/2025/12/fungus.svg) 2498 + (run 2499 + odoc 2500 + html-generate-asset 2501 + --asset-unit 2502 + _odoc/blog/2026/03/asset-mapdemo.mov.odocl 2503 + -o 2504 + _html 2505 + blog/2026/03/mapdemo.mov) 2506 + (run 2507 + odoc 2508 + html-generate-asset 2509 + --asset-unit 2510 + _odoc/blog/2026/03/asset-search.png.odocl 2511 + -o 2512 + _html 2513 + blog/2026/03/search.png) 1979 2514 (run odoc support-files -o _html) 1980 2515 (system 1981 - "mkdir -p $(dirname _html/static/assets/jon.jpg) && cp static/assets/jon.jpg _html/static/assets/jon.jpg")))) 2516 + "mkdir -p $(dirname _html/static/assets/jon.jpg) && cp static/assets/jon.jpg _html/static/assets/jon.jpg") 2517 + (system 2518 + "mkdir -p $(dirname _html/static/assets/notebook-foundations.png) && cp static/assets/notebook-foundations.png _html/static/assets/notebook-foundations.png") 2519 + (system 2520 + "mkdir -p $(dirname _html/static/assets/notebook-oxcaml.png) && cp static/assets/notebook-oxcaml.png _html/static/assets/notebook-oxcaml.png")))) 1982 2521 1983 2522 (alias 1984 2523 (name site) ··· 2030 2569 _html/blog/2026/02/weeknotes-2026-08.html 2031 2570 _html/blog/2026/03/index.html 2032 2571 _html/blog/2026/03/weeknotes-2026-09.html 2572 + _html/blog/2026/03/weeknotes-2026-10.html 2033 2573 _html/blog/2026/index.html 2034 2574 _html/blog/index.html 2035 2575 _html/drafts/index.html ··· 2051 2591 _html/notebooks/oxcaml/local.html 2052 2592 _html/projects/index.html 2053 2593 _html/reference/index.html 2054 - _html/static/assets/jon.jpg)) 2594 + _html/static/assets/jon.jpg 2595 + _html/static/assets/notebook-foundations.png 2596 + _html/static/assets/notebook-oxcaml.png 2597 + _html/blog/2025/05/alice.jpg 2598 + _html/blog/2025/05/amy.jpg 2599 + _html/blog/2025/05/emilio.jpg 2600 + _html/blog/2025/05/frank.jpg 2601 + _html/blog/2025/05/hattie.jpg 2602 + _html/blog/2025/05/marta.jpg 2603 + _html/blog/2025/05/melissa.jpg 2604 + _html/blog/2025/05/orlando.jpg 2605 + _html/blog/2025/05/ruari.jpg 2606 + _html/blog/2025/05/sadiq.jpg 2607 + _html/blog/2025/05/sebastian.jpg 2608 + _html/blog/2025/05/simon.jpg 2609 + _html/blog/2025/05/simond.jpg 2610 + _html/blog/2025/09/examination_map_histogram.png 2611 + _html/blog/2025/09/examination_map_histogram.svg 2612 + _html/blog/2025/12/fungus.svg 2613 + _html/blog/2026/03/mapdemo.mov 2614 + _html/blog/2026/03/search.png)) 2055 2615 2056 2616 (rule 2057 2617 (target ··· 2091 2651 blog/2026/02/weeknotes-2026-06.mld 2092 2652 blog/2026/02/weeknotes-2026-08.mld 2093 2653 blog/2026/03/weeknotes-2026-09.mld 2654 + blog/2026/03/weeknotes-2026-10.mld 2094 2655 blog/2025/03/index.mld 2095 2656 blog/2025/04/index.mld 2096 2657 blog/2025/05/index.mld
+92 -1
site/notebooks/index.mld
··· 1 1 {0 Notebooks} 2 2 @children_order foundations/ oxcaml/ 3 3 4 - Here you will find some odoc notebooks that I'm currently testing 4 + Interactive OCaml notebooks that run code directly in your browser. No installation required. 5 + 6 + {%html: 7 + <style> 8 + .notebook-cards { 9 + display: grid; 10 + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); 11 + gap: 1.25rem; 12 + margin: 1.5rem 0; 13 + } 14 + .notebook-card { 15 + background: var(--surface-color, #fff); 16 + border: 1px solid var(--border-color, #e0e0e0); 17 + border-radius: 10px; 18 + overflow: hidden; 19 + transition: box-shadow 0.2s, transform 0.2s; 20 + text-decoration: none; 21 + color: inherit; 22 + display: block; 23 + } 24 + .notebook-card:hover { 25 + box-shadow: 0 4px 16px rgba(0,0,0,0.08); 26 + transform: translateY(-2px); 27 + } 28 + .notebook-card-thumb { 29 + width: 100%; 30 + height: 180px; 31 + object-fit: cover; 32 + object-position: top; 33 + border-bottom: 1px solid var(--border-color, #e0e0e0); 34 + } 35 + .notebook-card-body { 36 + padding: 1.25rem; 37 + } 38 + .notebook-card-label { 39 + font-size: 0.75rem; 40 + font-weight: 600; 41 + letter-spacing: 0.05em; 42 + text-transform: uppercase; 43 + color: var(--accent-color, #b44e2d); 44 + margin-bottom: 0.5rem; 45 + } 46 + .notebook-card-title { 47 + font-size: 1.1rem; 48 + font-weight: 500; 49 + margin-bottom: 0.5rem; 50 + } 51 + .notebook-card-desc { 52 + font-size: 0.88rem; 53 + color: var(--text-muted, #666); 54 + line-height: 1.55; 55 + margin: 0; 56 + } 57 + @media (prefers-color-scheme: dark) { 58 + .notebook-card { 59 + background: var(--surface-color, #1a1a2e); 60 + border-color: var(--border-color, #333); 61 + } 62 + .notebook-card:hover { 63 + box-shadow: 0 4px 16px rgba(0,0,0,0.3); 64 + } 65 + .notebook-card-desc { 66 + color: var(--text-muted, #aaa); 67 + } 68 + } 69 + @media (max-width: 640px) { 70 + .notebook-cards { 71 + grid-template-columns: 1fr; 72 + } 73 + } 74 + </style> 5 75 76 + <div class="notebook-cards"> 77 + 78 + <a class="notebook-card" href="/notebooks/foundations/"> 79 + <img class="notebook-card-thumb" src="/static/assets/notebook-foundations.png" alt="Foundations of Computer Science notebook preview" loading="lazy"> 80 + <div class="notebook-card-body"> 81 + <div class="notebook-card-label">&lambda; Foundations</div> 82 + <div class="notebook-card-title">Foundations of Computer Science</div> 83 + <p class="notebook-card-desc">11 interactive notebooks from Cambridge's 1A Foundations course. Run OCaml code live in your browser.</p> 84 + </div> 85 + </a> 6 86 87 + <a class="notebook-card" href="/notebooks/oxcaml/local.html"> 88 + <img class="notebook-card-thumb" src="/static/assets/notebook-oxcaml.png" alt="OxCaml Locality Mode notebook preview" loading="lazy"> 89 + <div class="notebook-card-body"> 90 + <div class="notebook-card-label">&rlhar; OxCaml</div> 91 + <div class="notebook-card-title">Locality Mode OxCaml</div> 92 + <p class="notebook-card-desc">Explore stack allocation, modes, and regions in the OxCaml compiler extensions. Interactive exercises included.</p> 93 + </div> 94 + </a> 95 + 96 + </div> 97 + %}
site/static/assets/notebook-foundations.png

This is a binary file and will not be displayed.

site/static/assets/notebook-oxcaml.png

This is a binary file and will not be displayed.