Files
cs249r_book/shared/config/cloudflare-redirects.json
Vijay Janapa Reddi 714eecebb4 fix: flatten Quarto's double-nested vol URL structure at deploy time
Quarto renders chapters at contents/vol{N}/{chapter}/{chapter}.html
(depth 3 from site root), which deployed as the double-nested URL
mlsysbook.ai/vol{N}/contents/vol{N}/{chapter}/{chapter}.html.

Fixes:
- Add .github/scripts/flatten-vol-urls.sh: post-build script that
  moves contents/vol{N}/* to site root, fixes relative asset paths
  (../../../ → ../), search.json hrefs, sitemap.xml, and absolute
  URL refs in moved HTML files.
- book-publish-live.yml: run flatten script after artifact download,
  before release manifests, for both vol1-site and vol2-site.
- book-preview-dev.yml: add flatten-vol-urls.sh to sparse checkout
  and run flatten before rewrite-dev-urls so depth is correct.
- cloudflare-redirects.json: update all 37 "to" values to clean
  /vol{N}/{chapter}/... form; add 33 backward-compat entries for
  existing /vol{N}/contents/vol{N}/... live URLs.
- instructors/*.qmd: update 77 chapter hrefs to clean URL form.
2026-06-08 21:05:05 -04:00

285 lines
9.5 KiB
JSON

[
{
"_comment": "Vol1 short-form chapter URLs \u2192 correct nested paths",
"from": "/vol1/introduction.html",
"to": "https://mlsysbook.ai/vol1/introduction/introduction.html"
},
{
"from": "/vol1/ml_systems.html",
"to": "https://mlsysbook.ai/vol1/ml_systems/ml_systems.html"
},
{
"from": "/vol1/ml_workflow.html",
"to": "https://mlsysbook.ai/vol1/ml_workflow/ml_workflow.html"
},
{
"from": "/vol1/data_engineering.html",
"to": "https://mlsysbook.ai/vol1/data_engineering/data_engineering.html"
},
{
"from": "/vol1/nn_architectures.html",
"to": "https://mlsysbook.ai/vol1/nn_architectures/nn_architectures.html"
},
{
"from": "/vol1/frameworks.html",
"to": "https://mlsysbook.ai/vol1/frameworks/frameworks.html"
},
{
"from": "/vol1/training.html",
"to": "https://mlsysbook.ai/vol1/training/training.html"
},
{
"from": "/vol1/data_selection.html",
"to": "https://mlsysbook.ai/vol1/data_selection/data_selection.html"
},
{
"from": "/vol1/hw_acceleration.html",
"to": "https://mlsysbook.ai/vol1/hw_acceleration/hw_acceleration.html"
},
{
"from": "/vol1/benchmarking.html",
"to": "https://mlsysbook.ai/vol1/benchmarking/benchmarking.html"
},
{
"from": "/vol1/responsible_engr.html",
"to": "https://mlsysbook.ai/vol1/responsible_engr/responsible_engr.html"
},
{
"from": "/vol1/conclusion.html",
"to": "https://mlsysbook.ai/vol1/conclusion/conclusion.html"
},
{
"_comment": "Vol1 renamed chapter slugs",
"from": "/vol1/dl_primer.html",
"to": "https://mlsysbook.ai/vol1/nn_computation/nn_computation.html"
},
{
"from": "/vol1/efficient_ai.html",
"to": "https://mlsysbook.ai/vol1/optimizations/model_compression.html"
},
{
"from": "/vol1/model_compression.html",
"to": "https://mlsysbook.ai/vol1/optimizations/model_compression.html"
},
{
"from": "/vol1/serving.html",
"to": "https://mlsysbook.ai/vol1/model_serving/model_serving.html"
},
{
"from": "/vol1/on_device_inference.html",
"to": "https://mlsysbook.ai/vol1/model_serving/model_serving.html"
},
{
"from": "/vol1/ops.html",
"to": "https://mlsysbook.ai/vol1/ml_ops/ml_ops.html"
},
{
"from": "/vol1/responsible_ai.html",
"to": "https://mlsysbook.ai/vol1/responsible_engr/responsible_engr.html"
},
{
"_comment": "Vol2 short-form chapter URLs \u2192 correct nested paths",
"from": "/vol2/introduction.html",
"to": "https://mlsysbook.ai/vol2/introduction/introduction.html"
},
{
"from": "/vol2/compute_infrastructure.html",
"to": "https://mlsysbook.ai/vol2/compute_infrastructure/compute_infrastructure.html"
},
{
"from": "/vol2/network_fabrics.html",
"to": "https://mlsysbook.ai/vol2/network_fabrics/network_fabrics.html"
},
{
"from": "/vol2/data_storage.html",
"to": "https://mlsysbook.ai/vol2/data_storage/data_storage.html"
},
{
"from": "/vol2/distributed_training.html",
"to": "https://mlsysbook.ai/vol2/distributed_training/distributed_training.html"
},
{
"from": "/vol2/collective_communication.html",
"to": "https://mlsysbook.ai/vol2/collective_communication/collective_communication.html"
},
{
"from": "/vol2/fault_tolerance.html",
"to": "https://mlsysbook.ai/vol2/fault_tolerance/fault_tolerance.html"
},
{
"from": "/vol2/fleet_orchestration.html",
"to": "https://mlsysbook.ai/vol2/fleet_orchestration/fleet_orchestration.html"
},
{
"from": "/vol2/performance_engineering.html",
"to": "https://mlsysbook.ai/vol2/performance_engineering/performance_engineering.html"
},
{
"from": "/vol2/inference.html",
"to": "https://mlsysbook.ai/vol2/inference/inference.html"
},
{
"from": "/vol2/edge_intelligence.html",
"to": "https://mlsysbook.ai/vol2/edge_intelligence/edge_intelligence.html"
},
{
"from": "/vol2/ops_scale.html",
"to": "https://mlsysbook.ai/vol2/ops_scale/ops_scale.html"
},
{
"from": "/vol2/security_privacy.html",
"to": "https://mlsysbook.ai/vol2/security_privacy/security_privacy.html"
},
{
"from": "/vol2/robust_ai.html",
"to": "https://mlsysbook.ai/vol2/robust_ai/robust_ai.html"
},
{
"from": "/vol2/sustainable_ai.html",
"to": "https://mlsysbook.ai/vol2/sustainable_ai/sustainable_ai.html"
},
{
"from": "/vol2/responsible_ai.html",
"to": "https://mlsysbook.ai/vol2/responsible_ai/responsible_ai.html"
},
{
"from": "/vol2/conclusion.html",
"to": "https://mlsysbook.ai/vol2/conclusion/conclusion.html"
},
{
"_comment": "Backward-compat: old /vol{N}/contents/vol{N}/... \u2192 new clean /vol{N}/... paths"
},
{
"from": "/vol1/contents/vol1/ml_systems/ml_systems.html",
"to": "https://mlsysbook.ai/vol1/ml_systems/ml_systems.html"
},
{
"from": "/vol1/contents/vol1/ml_workflow/ml_workflow.html",
"to": "https://mlsysbook.ai/vol1/ml_workflow/ml_workflow.html"
},
{
"from": "/vol1/contents/vol1/data_engineering/data_engineering.html",
"to": "https://mlsysbook.ai/vol1/data_engineering/data_engineering.html"
},
{
"from": "/vol1/contents/vol1/nn_architectures/nn_architectures.html",
"to": "https://mlsysbook.ai/vol1/nn_architectures/nn_architectures.html"
},
{
"from": "/vol1/contents/vol1/frameworks/frameworks.html",
"to": "https://mlsysbook.ai/vol1/frameworks/frameworks.html"
},
{
"from": "/vol1/contents/vol1/training/training.html",
"to": "https://mlsysbook.ai/vol1/training/training.html"
},
{
"from": "/vol1/contents/vol1/data_selection/data_selection.html",
"to": "https://mlsysbook.ai/vol1/data_selection/data_selection.html"
},
{
"from": "/vol1/contents/vol1/hw_acceleration/hw_acceleration.html",
"to": "https://mlsysbook.ai/vol1/hw_acceleration/hw_acceleration.html"
},
{
"from": "/vol1/contents/vol1/benchmarking/benchmarking.html",
"to": "https://mlsysbook.ai/vol1/benchmarking/benchmarking.html"
},
{
"from": "/vol1/contents/vol1/responsible_engr/responsible_engr.html",
"to": "https://mlsysbook.ai/vol1/responsible_engr/responsible_engr.html"
},
{
"from": "/vol1/contents/vol1/conclusion/conclusion.html",
"to": "https://mlsysbook.ai/vol1/conclusion/conclusion.html"
},
{
"from": "/vol1/contents/vol1/optimizations/model_compression.html",
"to": "https://mlsysbook.ai/vol1/optimizations/model_compression.html"
},
{
"from": "/vol1/contents/vol1/optimizations/model_compression.html",
"to": "https://mlsysbook.ai/vol1/optimizations/model_compression.html"
},
{
"from": "/vol1/contents/vol1/model_serving/model_serving.html",
"to": "https://mlsysbook.ai/vol1/model_serving/model_serving.html"
},
{
"from": "/vol1/contents/vol1/model_serving/model_serving.html",
"to": "https://mlsysbook.ai/vol1/model_serving/model_serving.html"
},
{
"from": "/vol1/contents/vol1/ml_ops/ml_ops.html",
"to": "https://mlsysbook.ai/vol1/ml_ops/ml_ops.html"
},
{
"from": "/vol1/contents/vol1/responsible_engr/responsible_engr.html",
"to": "https://mlsysbook.ai/vol1/responsible_engr/responsible_engr.html"
},
{
"from": "/vol2/contents/vol2/compute_infrastructure/compute_infrastructure.html",
"to": "https://mlsysbook.ai/vol2/compute_infrastructure/compute_infrastructure.html"
},
{
"from": "/vol2/contents/vol2/network_fabrics/network_fabrics.html",
"to": "https://mlsysbook.ai/vol2/network_fabrics/network_fabrics.html"
},
{
"from": "/vol2/contents/vol2/data_storage/data_storage.html",
"to": "https://mlsysbook.ai/vol2/data_storage/data_storage.html"
},
{
"from": "/vol2/contents/vol2/distributed_training/distributed_training.html",
"to": "https://mlsysbook.ai/vol2/distributed_training/distributed_training.html"
},
{
"from": "/vol2/contents/vol2/collective_communication/collective_communication.html",
"to": "https://mlsysbook.ai/vol2/collective_communication/collective_communication.html"
},
{
"from": "/vol2/contents/vol2/fault_tolerance/fault_tolerance.html",
"to": "https://mlsysbook.ai/vol2/fault_tolerance/fault_tolerance.html"
},
{
"from": "/vol2/contents/vol2/fleet_orchestration/fleet_orchestration.html",
"to": "https://mlsysbook.ai/vol2/fleet_orchestration/fleet_orchestration.html"
},
{
"from": "/vol2/contents/vol2/performance_engineering/performance_engineering.html",
"to": "https://mlsysbook.ai/vol2/performance_engineering/performance_engineering.html"
},
{
"from": "/vol2/contents/vol2/inference/inference.html",
"to": "https://mlsysbook.ai/vol2/inference/inference.html"
},
{
"from": "/vol2/contents/vol2/edge_intelligence/edge_intelligence.html",
"to": "https://mlsysbook.ai/vol2/edge_intelligence/edge_intelligence.html"
},
{
"from": "/vol2/contents/vol2/ops_scale/ops_scale.html",
"to": "https://mlsysbook.ai/vol2/ops_scale/ops_scale.html"
},
{
"from": "/vol2/contents/vol2/security_privacy/security_privacy.html",
"to": "https://mlsysbook.ai/vol2/security_privacy/security_privacy.html"
},
{
"from": "/vol2/contents/vol2/robust_ai/robust_ai.html",
"to": "https://mlsysbook.ai/vol2/robust_ai/robust_ai.html"
},
{
"from": "/vol2/contents/vol2/sustainable_ai/sustainable_ai.html",
"to": "https://mlsysbook.ai/vol2/sustainable_ai/sustainable_ai.html"
},
{
"from": "/vol2/contents/vol2/responsible_ai/responsible_ai.html",
"to": "https://mlsysbook.ai/vol2/responsible_ai/responsible_ai.html"
},
{
"from": "/vol2/contents/vol2/conclusion/conclusion.html",
"to": "https://mlsysbook.ai/vol2/conclusion/conclusion.html"
}
]