Previously nginx try_files fell back to /index.html for any unmatched path,
which meant orphaned article variants (old slug directories) returned HTTP 200
with the homepage content. This caused ~1,150 orphaned pages to be crawlable.
Add explicit location blocks for /articles/ and /sections/ that use =404
instead of falling back to /index.html.
- Add sharp dependency for image format conversion
- Generate WebP (quality 80) and AVIF (quality 70) variants for all raster images
- Render <picture> elements with srcset fallbacks (AVIF > WebP > original)
- SVG images remain as <img> without picture wrapper
- Update Dockerfile to install libvips for sharp, copy from public/ dir
- Add nginx cache rules for .webp and .avif files
- Add .gitignore for node_modules, public, dist