diff --git a/crates/ui-egui/src/canvas.rs b/crates/ui-egui/src/canvas.rs
--- a/crates/ui-egui/src/canvas.rs
+++ b/crates/ui-egui/src/canvas.rs
@@ -49,10 +49,10 @@ use home::home;
 use input::handle_input;
 use outline::KEY_OUTLINE;
 #[cfg(test)]
-use outline::{OVERLAY_MAX_ANCHORS, c32, node_outline, walk_drawn};
+use outline::{DRAW_INSIDE_OUTLINE, OVERLAY_MAX_ANCHORS, c32, node_outline, walk_drawn};
 #[cfg(test)]
 use overlays::selected_anchor;
-use overlays::{HandleLook, draw_overlays, hover_highlight, ime_geometry, selection_overlay};
+use overlays::{HandleLook, draw_inside_indicator, draw_overlays, hover_highlight, ime_geometry, selection_overlay};
 pub(crate) use raster::color_image;
 use raster::{changed_pixels, pixel_region, upload};
 use task_bar::task_bar;
@@ -575,6 +575,7 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) {
             hover_highlight(app, &painter, &xf);
         }
         selection_overlay(app, &painter, &xf, overlays.iter().any(|o| matches!(o, Overlay::CurvePoint { .. })));
+        draw_inside_indicator(app, &painter, &xf);
         mirror_axis_overlay(app, &painter, &xf);
         grid_repeat_overlay(app, &painter, &xf);
         if app.ui.view.text_threads {
diff --git a/crates/ui-egui/src/canvas/outline.rs b/crates/ui-egui/src/canvas/outline.rs
--- a/crates/ui-egui/src/canvas/outline.rs
+++ b/crates/ui-egui/src/canvas/outline.rs
@@ -90,6 +90,9 @@ pub(super) fn node_outline(n: &Node, symbols: &SymbolBoxes) -> BezPath {
 /// The width of the key object's outline (Align to Key Object), thicker than the selection's.
 pub(super) const KEY_OUTLINE: f32 = 2.5;
 
+/// The width of the dashed outline that marks the object Draw Inside draws into.
+pub(super) const DRAW_INSIDE_OUTLINE: f32 = 1.5;
+
 /// The most points ([`overlay_points`]) the selection's outlines and anchors, and the hover
 /// highlight, are drawn for: an Image Trace of a photo selects hundreds of thousands of paths at
 /// once, and selecting all of an opened PDF can select as many type objects, images and gradient
diff --git a/crates/ui-egui/src/canvas/overlays.rs b/crates/ui-egui/src/canvas/overlays.rs
--- a/crates/ui-egui/src/canvas/overlays.rs
+++ b/crates/ui-egui/src/canvas/overlays.rs
@@ -1,6 +1,8 @@
 use super::artboards::names_an_artboard;
 use super::input::marquee_through;
-use super::outline::{KEY_OUTLINE, c32, node_outline, selection_hit_at, stroke_path, to_screen_path, too_many_anchors, walk_drawn};
+use super::outline::{
+    DRAW_INSIDE_OUTLINE, KEY_OUTLINE, c32, node_outline, selection_hit_at, stroke_path, to_screen_path, too_many_anchors, walk_drawn,
+};
 use super::*;
 
 pub(super) fn hover_highlight(app: &VectorcraftApp, p: &egui::Painter, xf: &Xf) {
@@ -68,6 +70,28 @@ fn curve_point(p: &egui::Painter, c: Pos2, color: Color32, filled: bool, size: f
     p.circle(c, size / 2.0, if filled { color } else { Color32::WHITE }, Stroke::new(1.0, color));
 }
 
+/// Draw Inside's indicator: a dashed outline around the object new art is drawn into, so the mode
+/// can be told to be on (#4319). Drawn in the object's layer colour.
+pub(super) fn draw_inside_indicator(app: &VectorcraftApp, p: &egui::Painter, xf: &Xf) {
+    if app.session.draw_mode != vectorcraft_engine::DrawMode::Inside {
+        return;
+    }
+    let Some(st) = app.session.active() else { return };
+    let Some((id, n)) = app.session.draw_inside.and_then(|id| Some((id, st.doc.node(id)?))) else { return };
+    let stroke = Stroke::new(DRAW_INSIDE_OUTLINE, c32(st.doc.layer_color(id)));
+    // Too many paths to outline every frame: the object's bounds stand for them.
+    let symbols = st.doc.symbol_boxes();
+    let outline = if too_many_anchors([n]) {
+        n.geometric_bounds_with(&symbols).map(|b| vectorcraft_geom::shapes::rectangle(b).to_bezpath())
+    } else {
+        Some(node_outline(n, &symbols))
+    };
+    let Some(outline) = outline else { return };
+    for line in to_screen_path(&outline, xf) {
+        p.extend(Shape::dashed_line(&line, stroke, 5.0, 3.0));
+    }
+}
+
 pub(super) fn selection_overlay(app: &mut VectorcraftApp, p: &egui::Painter, xf: &Xf, curve_points_from_tool: bool) {
     // The Selection tool's bounding box (rotated with the objects after a rotation). It hides while
     // a drag moves or resizes the selection, so only the art is seen going with the pointer (#712).
diff --git a/crates/ui-egui/src/canvas/tests.rs b/crates/ui-egui/src/canvas/tests.rs
--- a/crates/ui-egui/src/canvas/tests.rs
+++ b/crates/ui-egui/src/canvas/tests.rs
@@ -7131,3 +7131,72 @@ fn text_threads_skip_the_links_of_a_frame_in_perspective() {
     // One thread line (c to d) and its two arrows of three strokes each.
     assert_eq!(o.iter().filter(|x| matches!(x, Overlay::Line { .. })).count(), 7);
 }
+
+/// #4319: Draw Inside outlines the object it draws into with a dashed line in its layer colour, so
+/// the mode can be told to be on; Draw Normal and Draw Behind show none, and it goes with the mode.
+#[test]
+fn draw_inside_marks_its_object_with_a_dashed_outline() {
+    let mut app = VectorcraftApp::new(Session::new(), Default::default());
+    app.run("file.new", json!({"width": 400, "height": 300})).unwrap();
+    app.ui.task_bar = false;
+    app.ui.view.rulers = false;
+    let id = app.run("shape.rectangle", json!({"x": 100, "y": 100, "width": 100, "height": 100})).unwrap()["id"].clone();
+    app.run("select.set", json!({"ids": [id]})).unwrap();
+    let color = c32(app.session.active().unwrap().doc.layer_color(vectorcraft_doc::NodeId(id.as_u64().unwrap())));
+    let ctx = egui::Context::default();
+    frame(&mut app, &ctx, vec![]);
+    let xf = Xf::new(app.canvas_rect.unwrap(), app.view().unwrap());
+    let object = egui::Rect::from_two_pos(xf.to_screen(Point::new(100.0, 100.0)), xf.to_screen(Point::new(200.0, 200.0)));
+    let dashes = |app: &mut VectorcraftApp| -> Vec<(Pos2, Pos2)> {
+        shapes(app, &ctx)
+            .into_iter()
+            .filter_map(|s| match s {
+                Shape::LineSegment { points, stroke } if stroke.color == color && stroke.width == DRAW_INSIDE_OUTLINE => Some((points[0], points[1])),
+                _ => None,
+            })
+            .collect()
+    };
+    assert!(dashes(&mut app).is_empty(), "Draw Normal");
+    app.run("view.drawMode", json!({"mode": "behind"})).unwrap();
+    assert!(dashes(&mut app).is_empty(), "Draw Behind");
+    app.run("view.drawMode", json!({"mode": "inside"})).unwrap();
+    let on = dashes(&mut app);
+    assert!(on.len() > 8, "dashes all round the square: {on:?}");
+    assert!(on.iter().all(|(a, b)| object.expand(1.0).contains(*a) && object.expand(1.0).contains(*b)), "on the object's outline: {on:?}");
+    app.run("view.drawMode", json!({"mode": "normal"})).unwrap();
+    assert!(dashes(&mut app).is_empty(), "back to Draw Normal");
+}
+
+/// #4319: a Draw Inside object with more anchors than the overlays outline is marked by a dashed
+/// rectangle round its bounds, not by flattening its whole outline each frame.
+#[test]
+fn draw_inside_marks_a_huge_object_by_its_bounds() {
+    let mut app = VectorcraftApp::new(Session::new(), Default::default());
+    app.run("file.new", json!({"width": 400, "height": 300})).unwrap();
+    app.ui.task_bar = false;
+    app.ui.view.rulers = false;
+    let n = OVERLAY_MAX_ANCHORS + 10;
+    let points = (0..n).map(|i| format!("L{} {}", 20.0 + 360.0 * i as f64 / n as f64, 100 + (i % 2) * 50)).collect::<String>();
+    let huge = app.run("path.create", json!({"d": format!("M20 20 {points} Z")})).unwrap()["id"].clone();
+    app.run("select.set", json!({"ids": [huge]})).unwrap();
+    let color = c32(app.session.active().unwrap().doc.layer_color(vectorcraft_doc::NodeId(huge.as_u64().unwrap())));
+    let ctx = egui::Context::default();
+    frame(&mut app, &ctx, vec![]);
+    let xf = Xf::new(app.canvas_rect.unwrap(), app.view().unwrap());
+    app.run("view.drawMode", json!({"mode": "inside"})).unwrap();
+    let bounds = app.session.active().unwrap().doc.bounds_of(&[vectorcraft_doc::NodeId(huge.as_u64().unwrap())], false).unwrap();
+    let on_bounds = egui::Rect::from_two_pos(xf.to_screen(Point::new(bounds.x0, bounds.y0)), xf.to_screen(Point::new(bounds.x1, bounds.y1)));
+    let dashes: Vec<[Pos2; 2]> = shapes(&mut app, &ctx)
+        .into_iter()
+        .filter_map(|s| match s {
+            Shape::LineSegment { points, stroke } if stroke.color == color && stroke.width == DRAW_INSIDE_OUTLINE => Some(points),
+            _ => None,
+        })
+        .collect();
+    assert!(!dashes.is_empty(), "the bounds are dashed");
+    let edge = |q: Pos2| {
+        [on_bounds.min.x, on_bounds.max.x].iter().any(|x| (q.x - x).abs() < 0.5)
+            || [on_bounds.min.y, on_bounds.max.y].iter().any(|y| (q.y - y).abs() < 0.5)
+    };
+    assert!(dashes.iter().all(|d| d.iter().all(|q| edge(*q))), "only along the bounds rectangle: {dashes:?}");
+}
diff --git a/docs/gaps.md b/docs/gaps.md
--- a/docs/gaps.md
+++ b/docs/gaps.md
@@ -112,6 +112,7 @@ from G14 and the budget run of G15: **~170–270 h** one agent, ~50–80 h wall
 - **Done:** Artboard Options' Show Center Mark and Show Cross Hairs ([public source](https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/modify-display-settings-of-artboards.html)): per-artboard checkboxes (`artboard.setProps`/`artboard.new` `showCenterMark`, `showCrossHairs`) that the canvas draws as a center cross and lines from the middle of each side through the center; exports and print leave them out.
 - **Done (#2849):** Artboard Options' video display options ([public source](https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/set-video-display-options-for-artboards.html)): Show Video Safe Areas (`showVideoSafeAreas`) outlines the action-safe area 3.5% and the title-safe area 5% in from each edge, our choice from [EBU R 95](https://tech.ebu.ch/docs/r/r095.pdf) (the help page gives no numbers), on the canvas only; Video Ruler Pixel Aspect Ratio (`videoRulerPixelAspectRatio`, 0.1–10, default 1) is the width of one video pixel over its height. Both per artboard, one undo step, in the native format only when set. View › Rulers › Show Video Rulers is in G7.
 - **Done (#3705):** Draw Inside in isolation mode ([isolation mode](https://helpx.adobe.com/illustrator/desktop/manage-objects/select-objects/isolate-objects.html)): with the object drawn into isolated by a double-click, art drawn or pasted inside it takes isolation mode into its clip group, so it can be clicked and isn't dimmed; it used to stay locked and dimmed beside the isolated path, and double-clicks never reached the clip group.
+- **Done (#4319):** Draw Inside shows which object it draws into ([drawing modes](https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/learn-drawing-basics/drawing-modes-overview.html)): a dashed outline in the object's layer colour, drawn while the mode is on and gone with Draw Normal or Draw Behind; covered by a headless canvas frame test.
 - **Done:** Artboard Options' Show Center Mark and Show Cross Hairs ([public source](https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/modify-display-settings-of-artboards.html)): per-artboard checkboxes (`artboard.setProps`/`artboard.new` `showCenterMark`, `showCrossHairs`) that the canvas draws as a center cross and lines from the middle of each side through the center; exports and print leave them out. Video safe areas, video rulers and the pixel aspect ratio remain missing.
 - **Done:** Document Setup → Edit Artboards applies valid settings, closes the dialog and activates the Artboard tool. Pointer-click tests cover successful handoff, invalid settings, OK, Cancel and Undo in `dialogs/document_setup.rs`.
 - **Done (#2691):** a double-click on the Line Segment, Arc, Rectangular Grid or Polar Grid tool opens its Tool Options, as the [Rectangular Grid tool](https://helpx.adobe.com/illustrator/using/tool-techniques/rectangular-grid-tool.html) and [Arc tool](https://helpx.adobe.com/illustrator/using/tool-techniques/arc-tool.html) pages (step 3) and the [Tools](https://helpx.adobe.com/illustrator/using/tools.html) page describe: the tool's click dialog without a place to draw (Line Segment adds Fill Line; the grids keep their Default Size and Reference Point). OK draws nothing and sets what the next drag draws with and what a click's dialog opens at; Cancel changes nothing. Editing a grid's rows and columns after it is drawn (the rest of #2691) remains. Broader G1 estimate unchanged.
@@ -643,6 +644,7 @@ trap, and the defaults (0.25 pt, 100%, 40%) are VectorCraft's own, the pages giv
 | 2026-10-25 | minor | G12: Pathfinder panel › Pathfinder Options… (Precision, Remove Redundant Points, Divide and Outline Will Remove Unpainted Artwork), for #3426; no entry closed, estimate unchanged |
 | 2026-10-25 | minor | G12: Artboards panel › Delete Empty Artboards (`artboard.deleteEmpty`); no entry closed, estimate unchanged |
 | 2026-10-25 | minor | G12: the Transform panel menu's Transform Object Only / Pattern Only / Both (`transformPanelPatterns`) choose what the Transform panel and the Properties panel's Transform section transform (until a choice, General › Transform Pattern Tiles as before), and Use Registration Point for Symbol (`useRegistrationPointForSymbol`) measures and transforms one selected symbol instance from its registration point; estimate unchanged |
+| 2026-10-27 | minor | Fix #4319: Draw Inside outlines the object it draws into with a dashed line in its layer colour, so the mode shows on the canvas; no entry closed, estimate unchanged. |
 | 2026-10-24 | minor | G1: Live Paint Make, Merge and the Live Paint Bucket refuse type, images and other objects that aren't paths, changing nothing, instead of hiding them among the group's sources; Properties shows Merge Live Paint only for a selection it can take. No entry closed, estimates unchanged. |
 | 2026-10-24 | minor | G1: Properties: Blend Options and Merge Live Paint in Quick Actions, the Width Profile list and an applied effect's Delete icon in Appearance, and the kind and radius of corners selected with Direct Selection, as the public Properties panel overview lists them. No entry closed, estimates unchanged. |
 | 2026-10-24 | minor | Docs catch-up: G11's three Missing lines (left by merges, naming fixed bugs) become one: SVG units reverting to points (#864) and a Transform effect in a fill's or stroke's own effect list (#885) remain; Shape Builder regions (#937, closed), PDF text placement (#722), the bezier drag preview (#834) and interior anchor delete are done. G2's pre-#2883 "the Effect Gallery dialog" Missing and 4–6 h estimate lines and a duplicate Done line removed. Estimates unchanged. |
