feat: flatten output into variants/ and intermediates/

Drop per-job subdirs for phone-friendly Syncthing layout with
stem-suffixed filenames; keep web state in meta/.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Frank Schwenk
2026-07-18 14:52:47 +02:00
parent 9a9a3e3afe
commit b925b151f0
11 changed files with 289 additions and 220 deletions
+10 -5
View File
@@ -60,7 +60,8 @@ bad venue wifi. Nobody signs up, nobody logs in. Whoever has the link
(phone/folder setup is out of band).
- No beamer/projector product built into this repo.
- Not a DAM (digital asset manager) — no albums, tagging, search,
retention policies. `incoming/` and `jobs/` are the whole data model.
retention policies. `incoming/`, `variants/`, and `intermediates/`
are the whole data model.
- No auto-deletion of incoming uploads. Ever. The worker only reads/copies.
- No Syncthing container in this compose — Syncthing runs on the host.
@@ -70,8 +71,12 @@ bad venue wifi. Nobody signs up, nobody logs in. Whoever has the link
- Data volume (Syncthing share): `${DATA_HOST_DIR}` — prod default
`/home/frank/sync.schwenk.online/data/livef12`, local override `./data`.
Bind-mounted into `worker` and `web` at `/data` (see `compose.yml`).
- Layout under the share: `incoming/` (phone drop), `jobs/` (full tree
syncs back), `processed.json`.
- Layout under the share:
- `incoming/` — phone drop
- `variants/``{stem}_original.jpg`, `{stem}_rembg.png`, `{stem}_vN.png`
- `intermediates/``{stem}_vN_*.png` (incl. `_post_0` …)
- `meta/` — web bookkeeping JSON (optional `.stignore` on phone)
- `processed.json`
- Domain: `live.f12.rocks`, routed via the shared external `traefik`
network, TLS via `myresolver` (see `INFRASTRUCTURE.md`).
- rembg model cache lives in the named Docker volume `rembg_cache`, not
@@ -83,8 +88,8 @@ bad venue wifi. Nobody signs up, nobody logs in. Whoever has the link
- Never delete or move files under incoming/ from worker code — Syncthing
is the writer there. (reason: uploads are the one copy of the original
that exists outside a phone's camera roll)
- Keep every intermediate image in jobs/<id>/intermediates/ — don't clean
them up automatically. (reason: useful for debugging bad filter picks,
- Keep every intermediate image under intermediates/ — don't clean them
up automatically. (reason: useful for debugging bad filter picks,
disk is cheap compared to re-running gmic)
- gmic/rembg subprocess calls always run under `nice` (see NICE_LEVEL) —
the worker box needs to stay responsive for other things during an