Reflects state after the 2026-05-14 session: the OpenCLIP vision
classifier and worker-vision are gone, the db image is now postgres:16,
and the one-shot full_refresh.py reaped 7982 orphan thumbnail dirs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Vision fetches NC preview at 640px via new sync helper.
- WORKER_THUMB_SIZES = set(); generate_thumbnails still does pHash.
- All medium.webp purged after verification.
- Bug: SECRET_KEY was missing from workers in compose, so
Fernet decrypt silently failed everywhere outside the backend
container. Phase 3 had been falling back to ExifTool the whole
time. Fix replicates SECRET_KEY to all worker services.
Tries Memories /api/image/info/{fileid} first (OCS-APIRequest header
bypasses CSRF), falls back to ExifTool on 404 / non-NC / errors.
Kept the full date-fallback chain because 35% of the library uses
filename-encoded dates that Memories doesn't recover.
- handle_directory_rename in scan.py covers NC-side renames via the
webhook. Iterates rows in Python (asyncpg int-type quirk on raw
SUBSTRING+LENGTH).
- Existing PATCH /folders/{id} handles mule-side renames; webhook
feedback hits the same helper and is a 0-row no-op (idempotent).
- Folder delete now propagates: webhook handler detects directory
deletes and runs a single UPDATE that discards every Photo under
the path prefix.
- PUT-overwrite of a previously-discarded file now resurrects the
Photo row (is_discarded=false, re-queue extract_metadata).
- Trashbin restore and folder rename remain known gaps (documented).
- Worker-watcher retired; file events come from NC webhook_listeners.
- Thumbnails proxy /index.php/core/preview keyed by photos.nextcloud_fileid.
- backfill_gps auto-trigger killed (was queueing ~60k tasks per deploy).
- Range support added to /api/v1/photos/{id}/original so .mov plays.
- NC cron tightened to */1 for ~60s webhook latency.
ActiveHeapCard gone, Edit + Metadata collapsibles collapsed into one
Metadata block (readonly + hr + form), Camera split out at the
bottom. Section helper deleted along with the orphan ActiveHeapCard
component file.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
date_from went out as bare YYYY-MM-DD; pydantic v2 datetime parser
rejected it with 422, frontend swallowed the failure, grid showed
nothing. Fixed both sides.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EXIF:ModifyDate dropped, SubSec promoted, path-guess fallback added,
manual edits now preserved on rescan. backfill_taken_at sweep firing
across all non-manual photos.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After the hard-remove SourceRoot endpoint shipped, two real-world FK
issues surfaced (parent_id self-FK and cross-source-root children) and
one tz-aware datetime issue on PATCH /photos/{id}. All three fixed in
the same session. Trash icon also picks up a spinner during the multi-
second cascade.
Deploy.sh's --force-recreate flag isn't actually recreating reliably;
flagged as open infra question.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Trash icon is now an actual hard delete (SourceRoot + Folders +
Photos, Nextcloud files untouched). Watcher's 5-minute soft-time-
limit kill is fixed. Beat schedule fires discard_missing_photos
every 30 min as a safety net for events the real-time watcher
might miss.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LoginPage now bounces straight through Authentik when OIDC is on,
with skipAutoSso escape hatches for logout / error / explicit
password use. Also flagging that the first deploy.sh --force-recreate
run raced with a manual --no-deps recreate and broke the stack;
recovery via docker compose down && up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
/opt/mule-deploy/deploy.sh now runs docker compose up -d --build
--force-recreate. Eliminates the recurring 'image rebuilt but
container not restarted' issue we hit three times during the
perf-sweep session.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Heap card stays pinned at the top, editable form + readonly metadata
share a single scroll area, and the four readonly sections are now
wrapped in one outer Metadata collapsible.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Five fixes this session: backend out of dev mode, PIL fallback for
iPhone Apple ProRAW Linear DNG, source root state classification so
prune-missing handles renamed folders, smaller initial page size +
idle polling backoff, and a partial index on photos that takes the
list query from 25ms seq-scan to 0.1ms index-only scan.
Also flags the deploy.sh --force-recreate gap that bit twice this
session and the outstanding data-drift (4,154 orphan rows + one
unregistered folder).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Backend was running --reload single-worker in production. Switched to
--workers 2 --proxy-headers. Also note the deploy.sh quirk where a
runtime-only command change needed --force-recreate to take effect.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Initial documentation of the hubris Proxmox homelab as a cross-linked
markdown wiki. Per-node pages, cross-cutting infrastructure pages, an
investigation log, and an operations cheatsheet. Each node and topic
ends with a Changelog section so changes can be tracked in-place going
forward.
Refreshed against live state on 2026-04-28 — 14 active LXCs (109
syncthing currently stopped) + 1 VM (108 haos). Reflects post-A/B-test
state of the 2026-04-21 hubris crash-loop investigation.