m038 4882f4ca5a feat(spike): read-only pgvector probe + live findings
scripts/pgvector_spike.py probes Immich's Postgres read-only (session-level
read-only guard) and answers the M1.5 prerequisites against the live DB:
catalog-discovered embedding table/column, vector dimension, distance operator
(from the index opclass), the embedding->asset FK join, and coverage over the
IMAGE population. Discovers the asset table name from the FK (asset, not the
legacy assets) rather than hardcoding it, so it survives Immich version drift.

Findings (this Immich version): smart_search.embedding, 1152-dim, cosine <=>
(vector_cosine_ops), assetId->asset.id join clean (0 orphans), ~44% image
coverage (CLIP re-run in progress). Doc is M1.5's version-pinned contract.
2026-06-27 20:39:31 +02:00

immich-photo-flow

A monorepo of small tools that clean up and structure a large Immich library into travel "memories". M1 ships the shared foundation (shared/photoflow/{immich,core,ui}) and the trip-cluster app.

Layout

  • shared/photoflow/immich — the one Immich REST client + _pipeline/ tag conventions.
  • shared/photoflow/core — SQLite store + domain models (the only SQL).
  • shared/photoflow/ui — base template, DaisyUI/Tailwind/Alpine/HTMX, shared grid+lightbox.
  • apps/trip-cluster — CLI + Flask review UI (port 8084).

Dev setup

python3.12 -m venv .venv
.venv/bin/pip install -e ./shared -e ./apps/trip-cluster \
    pytest==8.3.4 pytest-httpserver==1.1.0 pytest-playwright==0.6.2
.venv/bin/python -m pytest                 # unit + route tests
.venv/bin/python -m playwright install chromium
.venv/bin/python -m pytest apps/trip-cluster/tests/ui   # Playwright UI

trip-cluster workflow

cp .env.example .env       # fill IMMICH_URL + IMMICH_API_KEY
cd apps/trip-cluster
python categorize.py ingest --tag "Italy 2019"     # or --from/--to/--subset
python categorize.py cluster
python categorize.py serve                          # review at http://localhost:8084
python categorize.py apply                          # write approved tags back (asks to confirm)

Immich is the source of truth; SQLite is a rebuildable working layer. Content/trip tags are never namespaced; pipeline meta-tags live under _pipeline/.

S
Description
End to end photo flow tool chain
Readme
233 KiB
Languages
Python 87%
JavaScript 6.6%
HTML 6.2%
Dockerfile 0.2%