diff --git a/app/views/active_storage/blobs/_blob.html.erb b/app/views/active_storage/blobs/_blob.html.erb
new file mode 100644
index 0000000..cbec938
--- /dev/null
+++ b/app/views/active_storage/blobs/_blob.html.erb
@@ -0,0 +1,20 @@
+<%# Files are posted as a message's own attachment, which gets its preview when it's posted; the composer adds none to
+ the rich text. One that's there anyway shows a preview only if it was already made, rather than linking to a URL
+ that makes it, on any view, for as long as it fails. %>
+<% preview = blob.variant(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) if blob.variable? %>
+<% preview = nil unless preview&.processed? %>
+
+ attachment--<%= blob.filename.extension %>">
+ <% if preview %>
+ <%= image_tag preview, alt: blob.try(:alt) %>
+ <% end %>
+
+
+ <% if caption = blob.try(:caption) %>
+ <%= caption %>
+ <% else %>
+ <%= blob.filename %>
+ <%= number_to_human_size blob.byte_size %>
+ <% end %>
+
+
diff --git a/app/views/messages/_message.html.erb b/app/views/messages/_message.html.erb
index d0c491f..77732cd 100644
--- a/app/views/messages/_message.html.erb
+++ b/app/views/messages/_message.html.erb
@@ -1,7 +1,7 @@
<%# Be sure to check/update messages/_template.html.erb when changing this file %>
<%# Bump this version when the message presentation filters change what they emit. Editing this line changes the template digest, which busts BOTH this fragment cache and the collection cache that keys on this partial's digest (helper Ruby changes alone don't). %>
-<% cache [ message, "presentation-v3" ] do %>
+<% cache [ message, "presentation-v4" ] do %>
<%= message_tag message do %>