Aha: after patching Elfeed to render after buffer display (which seems to fix the display of raster images), I actually did find behaviour that I believe should be addressed in shr, not in Elfeed; let me know what you think. If an image is a SVG, `shr-put-image` will not respect `shr-max-image-proportion`, because it will pass it directly to `create-image`, instead of resizing it: #+begin_src elisp ;; in `shr-put-image` ((eq content-type 'image/svg+xml) (when (image-type-available-p 'svg) (create-image data 'svg t :ascent shr-image-ascent))) (t (ignore-errors (shr-rescale-image data content-type (plist-get flags :width) (plist-get flags :height))))))) #+end_src As I understand it, this decision was likely made because the dimensions of SVGs is weird; they aren't inherently required to have a size, but the SVG itself can define a viewbox with accompanying width and height (full disclosure: I have no idea what I'm talking about). Using `shr-rescale-image` instead seems to do the trick (and respects SVGs that should display smaller than `shr-max-image-proportion`), but please do let me know if I'm ignoring an edge case or there's a better way to address this. #+begin_src elisp (setq shr-put-image-function (lambda (spec alt &optional flags) (if (display-graphic-p) (let* ((size (cdr (assq 'size flags))) (data (if (consp spec) (car spec) spec)) (content-type (and (consp spec) (cadr spec))) (start (point)) (image (cond ((eq size 'original) (create-image data nil t :ascent 100 :format content-type)) ;; BEGIN fix ((eq content-type 'image/svg+xml) (when (image-type-available-p 'svg) ; (create-image data 'svg t :ascent 100))) (shr-rescale-image data 'svg (plist-get flags :width) (plist-get flags :height)))) ;; END fix ((eq size 'full) (ignore-errors (shr-rescale-image data content-type (plist-get flags :width) (plist-get flags :height)))) (t (ignore-errors (shr-rescale-image data content-type (plist-get flags :width) (plist-get flags :height))))))) (when image ;; When inserting big-ish pictures, put them at the ;; beginning of the line. (when (and (> (current-column) 0) (> (car (image-size image t)) 400)) (insert "\n")) (let ((image-pos (point))) (if (eq size 'original) (insert-sliced-image image (or alt "*") nil 20 1) (insert-image image (or alt "*"))) (put-text-property start (point) 'image-size size) (when (and shr-image-animate (cdr (image-multi-frame-p image))) (image-animate image nil 60 image-pos)))) image) (insert (or alt ""))))) #+end_src elisp