diff --git a/crates/engine/src/cmd/file/rest_import_tests.rs b/crates/engine/src/cmd/file/rest_import_tests.rs
--- a/crates/engine/src/cmd/file/rest_import_tests.rs
+++ b/crates/engine/src/cmd/file/rest_import_tests.rs
@@ -185,3 +185,15 @@ fn open_and_import_rest_json() {
     assert!(crate::components::mirror_issues(doc).is_empty());
     let _ = std::fs::remove_dir_all(&dir);
 }
+
+#[test]
+fn thumbnail_shows_the_frame_set_as_thumbnail() {
+    let mut s = Session::new();
+    let cover = s.execute("frame.create", &json!({"name": "Cover", "x": 0, "y": 600, "width": 100, "height": 100})).unwrap();
+    s.execute("frame.create", &json!({"name": "Wide", "x": 700, "y": 600, "width": 600, "height": 100})).unwrap();
+    s.execute("object.setThumbnail", &json!({"id": cover["id"]})).unwrap();
+    let png = thumbnail(s.doc().unwrap()).unwrap();
+    let w = u32::from_be_bytes(png[16..20].try_into().unwrap());
+    let h = u32::from_be_bytes(png[20..24].try_into().unwrap());
+    assert_eq!(w, h, "square frame, got {w}x{h}");
+}
diff --git a/crates/engine/src/cmd/file/save.rs b/crates/engine/src/cmd/file/save.rs
--- a/crates/engine/src/cmd/file/save.rs
+++ b/crates/engine/src/cmd/file/save.rs
@@ -3,10 +3,21 @@ use super::load::{ext, file_stem, write};
 use super::open::remember;
 use super::*;
 
-/// Thumbnail PNG of the first page's content (for file browsers / the home screen).
+/// Thumbnail PNG of the frame marked by "Set as thumbnail" (on any page), else of the first page's
+/// content (for file browsers / the home screen).
 pub fn thumbnail(doc: &Document) -> Option<Vec<u8>> {
-    let page = doc.first_page()?;
-    let b = doc.page_content_bounds(page)?;
+    let marked = doc
+        .ids()
+        .find(|&n| doc.node(n).is_some_and(|node| node.plugin_data.contains_key("figcraft.thumbnail")))
+        .and_then(|n| Some((doc.page_of(n)?, doc.world_bounds(n)?)))
+        .filter(|(_, b)| b.width() > 0.0 && b.height() > 0.0);
+    let (page, b) = match marked {
+        Some(m) => m,
+        None => {
+            let page = doc.first_page()?;
+            (page, doc.page_content_bounds(page)?)
+        }
+    };
     let scale = (400.0 / b.width().max(b.height()).max(1.0)).min(2.0);
     let view = figcraft_render::View {
         origin: (b.x0, b.y0),
