diff --git a/a6000-comfy/install_junie_ollama_a6000.sh b/.junie/install_junie_ollama_a6000.sh
similarity index 100%
rename from a6000-comfy/install_junie_ollama_a6000.sh
rename to .junie/install_junie_ollama_a6000.sh
diff --git a/tour-comfy/watcher.lock b/.trash/watcher.lock
similarity index 100%
rename from tour-comfy/watcher.lock
rename to .trash/watcher.lock
diff --git a/tour-comfy/watcher.py b/.trash/watcher.py
similarity index 97%
rename from tour-comfy/watcher.py
rename to .trash/watcher.py
index 5455e50..81009ec 100644
--- a/tour-comfy/watcher.py
+++ b/.trash/watcher.py
@@ -60,8 +60,11 @@ def get_processed_files():
def save_processed_files(processed):
try:
- with open(CONF["processed_file"], 'w') as f:
+ p = CONF["processed_file"]
+ tmp = p + ".tmp"
+ with open(tmp, 'w') as f:
json.dump(processed, f, indent=2)
+ os.replace(tmp, p)
except Exception as e:
logging.error(f"Error saving processed file: {e}")
@@ -253,9 +256,11 @@ def update_car_html():
new_content = re.sub(pattern, replacement, content, flags=re.DOTALL)
- with open(car_html_path, 'w') as f:
+ tmp_path = car_html_path + ".tmp"
+ with open(tmp_path, 'w') as f:
f.write(new_content)
- logging.info(f"Updated {car_html_path} with {len(images)} images")
+ os.replace(tmp_path, car_html_path)
+ logging.info(f"Updated {car_html_path} atomically with {len(images)} images")
except Exception as e:
logging.error(f"Failed to update car.html: {e}")
diff --git a/tour-comfy/deploy.sh b/MI50/deploy.sh
similarity index 100%
rename from tour-comfy/deploy.sh
rename to MI50/deploy.sh
diff --git a/tour-comfy/env.sh b/MI50/env.sh
similarity index 100%
rename from tour-comfy/env.sh
rename to MI50/env.sh
diff --git a/tour-comfy/run_comfyui.sh b/MI50/run_comfyui_mi50.sh
similarity index 100%
rename from tour-comfy/run_comfyui.sh
rename to MI50/run_comfyui_mi50.sh
diff --git a/tour-comfy/start_api.sh b/MI50/start_api.sh
similarity index 100%
rename from tour-comfy/start_api.sh
rename to MI50/start_api.sh
diff --git a/tour-comfy/start_watcher.sh b/MI50/start_watcher.sh
similarity index 100%
rename from tour-comfy/start_watcher.sh
rename to MI50/start_watcher.sh
diff --git a/tour-comfy/stop.sh b/MI50/stop.sh
similarity index 100%
rename from tour-comfy/stop.sh
rename to MI50/stop.sh
diff --git a/a6000-comfy/deploy.sh b/a6000-comfy/deploy.sh
index 6f60f94..d1c3fdf 100755
--- a/a6000-comfy/deploy.sh
+++ b/a6000-comfy/deploy.sh
@@ -20,7 +20,7 @@ echo "Installing services: user=$SVC_USER group=$SVC_GROUP"
echo " a6k=$A6K"
echo " tour=$TOUR"
-for unit in comfyui-backend comfyui-api comfyui-watcher; do
+for unit in comfyui-backend comfyui-api; do
sed -e "s|__USER__|$SVC_USER|g" \
-e "s|__GROUP__|$SVC_GROUP|g" \
-e "s|__A6K__|$A6K|g" \
@@ -36,10 +36,10 @@ echo "Reloading systemd daemon..."
systemctl daemon-reload
echo "Enabling services + target..."
-systemctl enable comfyui-backend.service comfyui-api.service comfyui-watcher.service comfyui.target
+systemctl enable comfyui-backend.service comfyui-api.service comfyui.target
echo "Starting system..."
systemctl start comfyui.target
echo "Deployment complete."
-echo "Check status with: systemctl status comfyui.target comfyui-backend comfyui-api comfyui-watcher"
+echo "Check status with: systemctl status comfyui.target comfyui-backend comfyui-api"
diff --git a/tour-comfy/install_facefusion.sh b/a6000-comfy/install_facefusion.sh
similarity index 100%
rename from tour-comfy/install_facefusion.sh
rename to a6000-comfy/install_facefusion.sh
diff --git a/tour-comfy/install_gfpgan.sh b/a6000-comfy/install_gfpgan.sh
similarity index 100%
rename from tour-comfy/install_gfpgan.sh
rename to a6000-comfy/install_gfpgan.sh
diff --git a/a6000-comfy/start_api.sh b/a6000-comfy/start_api.sh
index a8c523e..7b7aac0 100755
--- a/a6000-comfy/start_api.sh
+++ b/a6000-comfy/start_api.sh
@@ -15,8 +15,15 @@ NV_LIBS=$(find "$VENV"/lib/python*/site-packages/nvidia -maxdepth 2 -name lib -t
export COMFY_URL="http://127.0.0.1:8188"
export HOST="0.0.0.0"
export PORT="8500"
+
+# A6000 48GB is not VRAM-bound here, so default to a ~2MP output budget.
+# This comfortably allows full-HD-ish outputs like 1920x1080.
+# Override via MAX_AREA when needed.
+export MAX_AREA="${MAX_AREA:-2097152}"
+
+# @LEGACY PREVIOUS VERSION
# The A6000 is fast and not VRAM-bound on this model, so default to a full ~1MP
# output budget (tour caps at 0.65MP to survive the MI50). Override via MAX_AREA.
-export MAX_AREA="${MAX_AREA:-1048576}"
+# export MAX_AREA="${MAX_AREA:-1048576}"
exec python edit_api.py
diff --git a/a6000-comfy/systemd/comfyui-watcher.service b/a6000-comfy/systemd/comfyui-watcher.service
deleted file mode 100644
index c9ebf8a..0000000
--- a/a6000-comfy/systemd/comfyui-watcher.service
+++ /dev/null
@@ -1,17 +0,0 @@
-[Unit]
-Description=Qwen-Image-Edit Folder Watcher (A6000)
-After=comfyui-api.service
-Requires=comfyui-api.service
-
-[Service]
-Type=simple
-User=__USER__
-Group=__GROUP__
-ExecStart=/bin/bash __TOUR__/start_watcher.sh
-Restart=on-failure
-RestartSec=5
-StandardOutput=journal
-StandardError=journal
-
-[Install]
-WantedBy=comfyui.target
diff --git a/a6000-comfy/systemd/comfyui.target b/a6000-comfy/systemd/comfyui.target
index 127cb9a..c066145 100644
--- a/a6000-comfy/systemd/comfyui.target
+++ b/a6000-comfy/systemd/comfyui.target
@@ -1,7 +1,7 @@
[Unit]
-Description=Qwen-Image-Edit Complete System (A6000)
-Wants=comfyui-backend.service comfyui-api.service comfyui-watcher.service
-After=comfyui-watcher.service
+Description=Afterimage (A6000)
+Wants=comfyui-backend.service comfyui-api.service
+After=comfyui-backend.service comfyui-api.service
[Install]
WantedBy=multi-user.target
diff --git a/backlog.md b/backlog.md
index 3c2957d..680b1c5 100644
--- a/backlog.md
+++ b/backlog.md
@@ -82,7 +82,21 @@ Scenery:
- tab "SAM" checkerboard icon to studio-view overlay
- in the landing page hide SOURCE images
- als het input bestand real is, dan gaat echt elke opvolging perfect. supe plaatjes.. (3 kwart maakt de opvolgende plaatjes ook altijd engaging.. top down (vanwege ruimte))
--
+- When open the app via the launcher, make it privacy enabled by default, so the privacy screen will appear.
+- When open a group by default hide orbit images, videos
+- Do not show videos in the landingpage image-loop
+- Make - html per group and html for the landing page. Decouple the landingpage from the studio and studio is hydrated available per group
+- update svg
+- Extract the heavy model API, so we can unit-test it. ( and we can stand-alone disable it ) and doesnt require the entire 41gb model to load into memory for a simple backend update
+- Save pose-prompt history + refine + reverse engineer + Scenery prompt in database. create a new db table called prompt, add the type of prompt for exmaple refine or scene to the record and all relevant information used to recontruct the prompt input. so also include a jsonb for metadata/tags etc.
+- In order to decouple the model-engine (by design it can be turned off) and the backend (by design it can be turned off)
+ - in the UI right top make two dots indicating the model-engine, backend is online and if its (actively processing a task), use the healthchecks of the services to check realtime status.
+ - in case the Model-engine is offline, we want to disable the UI-actions that require the model-engine, such as pose generation,
+ - in case the backend is offline, we want to disable the UI-actions that require the backend, such as duplicate, pad, crop, etc..
+ Start by implmenting the mechanics of the status leds in the UI. and disable one or two features that require the model-engine or the backend to be online. We complete the task after review
+- in order to decouple the landingpage/dashboard from the studio view (editor) we are going to generate group "shoot" specific html pages. Start by just generate the studio portion of car.html into the group specifc html pages. It does not need to be synchronous, but when data of the group is changing we should update the group specifc data json file too, we copy the goup files to the output folder next to car.html
+- in /mnt/zim/tour-comfy/output/_turntable we have data regarding orbit generations. We want to store the orbit data in the database, start by adding the corresponding tags and meta info to the images (currently stored in the person table (but actually are images with metadata))
+- in the ui - studio view we have an orbit filter. Currently the filter is filtering too many files, also references of orbit files are being marked orbit. When an orbit file is used, the metadata should not include the orbit tag.
## refine
- when refresh page, we lose track of current jobs running.
@@ -129,7 +143,8 @@ TRACKING
4) add a new video filter, and hide video by default in the Group Active
-- feel free to furhter optimize the studio view "info" tab
-1) for every image we have an entry in the database, keep for every image an entry with the same filename in the same folder but ending with json. in the json we store the functional representation of the database record and keep it up-to-date when data changes. .
+so we have a postgres-db, the frontend car.html and the backend edit_api.py
+1) for every image we have an entry in the database table person, keep for every image an entry with the same filename in the same folder but ending with json. in the json we store the functional representation of the database record and keep it up-to-date when data changes. .
In the app we looking at groups of images, so also keep track of the group, this include the additional functional features we show in the UI for that group with the images it includes. Keep the data up-to-date in the backend when data changes, also update the referring data files.
2) introduce a rating feature. to thumps up or thumbs down an image. When an image gets athamps up or thumbs down add a tag in the db and show it in the UI. Also the default filter in "Group Active" should filter out the images with a negative rating, but also include a filter that would show only images with a positive rating. The rating should also cascade (calculated? perhaps) into the poses. So images with pose that have good rating will define the rating of a pose, same for the image group (use a clever normalized formula ) over the positive and negative thumbs to compare it with another group
3) introduce (?cosine) similarity variation indexes in a group. Also for the faces in a group. To keep track of authenticity of a person in a group
diff --git a/studio.sh b/studio.sh
new file mode 100755
index 0000000..5e5205a
--- /dev/null
+++ b/studio.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Launch the studio UI in a clean Chrome profile (no stale cache)
+TMPDIR=$(mktemp -d /tmp/chrome-studio-XXXXXX)
+trap "rm -rf '$TMPDIR'" EXIT
+
+DRI_PRIME=pci-0000_02_00_0 \
+google-chrome \
+ --disable-web-security \
+ --allow-file-access-from-files \
+ --user-data-dir="$TMPDIR" \
+ --disable-dev-shm-usage \
+ --no-first-run \
+ --no-default-browser-check \
+ --disable-infobars \
+ --test-type \
+ --ozone-platform=x11 \
+ --disable-vulkan \
+ --use-gl=desktop \
+ --log-level=3 \
+ --silent-debugger-extension-api \
+ --app="file:///mnt/zim/tour-comfy/output/car.html" \
+ 2>/dev/null
diff --git a/tour-comfy/car.html b/tour-comfy/car.html
index bc20356..fa64f87 100644
--- a/tour-comfy/car.html
+++ b/tour-comfy/car.html
@@ -1817,7 +1817,7 @@
/* ===================== SCENERY TAB ===================== */
.scene-frame-preview {
width: 100%; aspect-ratio: 16/9; background: #111;
- border-radius: 6px; overflow: hidden; display: none;
+ border-radius: 6px; overflow: hidden; display: block;
margin-bottom: 8px; position: relative;
}
.scene-frame-preview img { width:100%; height:100%; object-fit:contain; display:block; }
@@ -2055,6 +2055,7 @@
`;
+ if (fileObjects.length === 0) {
+ // Only show "no images" if gallery is currently empty (avoid flash on slow API)
+ if (!gallery.querySelector('.image-card')) {
+ gallery.innerHTML = `
+