diff --git a/themes/patek/layouts/shortcodes/blogPhoto.html b/themes/patek/layouts/shortcodes/blogPhoto.html
new file mode 100644
index 0000000..e160b54
--- /dev/null
+++ b/themes/patek/layouts/shortcodes/blogPhoto.html
@@ -0,0 +1,51 @@
+{{- /*
+Usage:
+
+{{< blogPhoto "filename_relative_to_page.ext" "Alt text" >}}
+
+or
+
+{{< blogPhoto src="filename_relative_to_page.ext" alt="Alt text" … >}}
+
+where possible named params are:
+* src - path to the image in page bundle
+* alt - textual description of the image, the
alt attribute
+* caption (optional) - the caption displayed under the image, defaults to `alt`. Set to false to disable caption rendering
+
+*/ -}}
+{{- $imageName := false -}}
+{{- $alt := false -}}
+{{- if .IsNamedParams -}}
+ {{- $imageName = .Get "src" | default nil -}}
+ {{- $alt = .Get "alt" | default nil -}}
+{{- else -}}
+ {{- $imageName = .Get 0 -}}
+ {{- $alt = .Get 1 -}}
+{{- end -}}
+{{- if (eq $imageName nil) }}{{ errorf "Missing image name in %s" .Position }}{{ end -}}
+{{- if (eq $alt nil) }}{{ errorf "Missing alt for image %s in %s" $imageName .Position }}{{ end -}}
+{{- $caption := cond (eq (.Get "caption") false) false (default $alt (.Get "caption")) -}}
+
+{{- $img := .Page.Resources.GetMatch $imageName | default nil -}}
+{{- if (eq $img nil) }}{{ errorf "Image %s not found in %s" $imageName .Position }}{{ end -}}
+{{- $sizes := slice (slice 640 360 50) (slice 1280 720 50) (slice 1920 1080 50) -}}
+{{- $srcset := slice -}}
+{{- $largest := false -}}
+{{- range $sizes -}}
+ {{- if (or (gt $img.Width (index . 0)) (gt $img.Height (index . 1))) -}}
+ {{- $resized := $img.Fit (printf "%dx%d q%d" (index . 0) (index . 1) (index . 2)) -}}
+ {{- $srcset = $srcset | append (printf "%s %dw" $resized.RelPermalink (index . 0)) -}}
+ {{- $largest = $resized -}}
+ {{- end -}}
+{{- end -}}
+
+{{- if (lt (len $srcset) (len $sizes)) -}}
+ {{- $compressed := $img.Fit (printf "%dx%d q90" $img.Width $img.Height) -}}
+ {{- $srcset = $srcset | append (printf "%s %dw" $compressed.RelPermalink $compressed.Width) -}}
+ {{- $largest = $compressed -}}
+{{- end -}}
+
+
+
+ {{ if (ne $caption false) }}{{ $caption }}{{ end }}
+