diff --git a/movie_editor/frontend/index.html b/movie_editor/frontend/index.html
index 962c1c15..0437a817 100644
--- a/movie_editor/frontend/index.html
+++ b/movie_editor/frontend/index.html
@@ -15,11 +15,19 @@
var b = document.getElementById("boot-error");
if (!b) {
b = document.createElement("div"); b.id = "boot-error";
- b.style.cssText = "position:fixed;z-index:99999;left:0;right:0;top:0;padding:10px 14px;" +
+ b.style.cssText = "position:fixed;z-index:99999;left:0;right:0;top:0;padding:10px 34px 10px 14px;" +
"background:#3a1320;color:#ffb3c1;font:12px/1.5 monospace;border-bottom:1px solid #e0566b;white-space:pre-wrap";
+ var x = document.createElement("button");
+ x.textContent = "✕"; x.title = "Dismiss";
+ x.style.cssText = "position:absolute;top:6px;right:8px;background:transparent;border:1px solid #e0566b;" +
+ "color:#ffb3c1;border-radius:6px;cursor:pointer;font:12px monospace;padding:1px 7px;line-height:1.4";
+ x.onclick = function () { b.remove(); };
+ b.appendChild(x);
(document.body || document.documentElement).appendChild(b);
}
- b.textContent = "Movie Editor error — " + msg + "\n(restart ComfyUI + hard-reload Cmd/Ctrl+Shift+R; if it persists, send me this text)";
+ var t = b.querySelector(".boot-error-text");
+ if (!t) { t = document.createElement("span"); t.className = "boot-error-text"; b.insertBefore(t, b.firstChild); }
+ t.textContent = "Movie Editor error — " + msg + "\n(restart ComfyUI + hard-reload Cmd/Ctrl+Shift+R; if it persists, send me this text)";
}
window.addEventListener("error", function (e) {
show((e.message || "load error") + (e.filename ? " @ " + e.filename.split("/").pop() + ":" + e.lineno : ""));
diff --git a/movie_editor/server.py b/movie_editor/server.py
index 838f5307..4669eccf 100644
--- a/movie_editor/server.py
+++ b/movie_editor/server.py
@@ -88,7 +88,9 @@ def _prepare_media(proj: Project) -> Optional[dict]:
src = sc.source
ref = getattr(src, "media_ref", None)
tgt = getattr(src, "target", None)
- if not (src and getattr(src, "type", "") in ("image", "generated_frame") and ref and tgt):
+ # A target is OPTIONAL now (routing is automatic — the image becomes a LoadImage
+ # IMAGE producer that auto-wires). Only an asset reference is required.
+ if not (src and getattr(src, "type", "") in ("image", "generated_frame") and ref):
continue
path = media.path_for(ref)
if not path: