Commit Graph
397 Commits
Author SHA1 Message Date
ilia fd4346f838 Sprint C#15-16: paginate Approve Identified API/UI and in-app photo preview. 2026-08-04 21:42:02 -04:00
ilia 14190e2c95 Sprint C#14: Auto-Match progress bar, elapsed time, and cancel. 2026-08-04 21:41:06 -04:00
ilia 44151e960a Sprint C#13: toast + confirm dialogs on admin review pages. 2026-08-04 21:40:28 -04:00
ilia b78e11bfb0 Sprint C#12: arrow-key prev/next on Identify face queue. 2026-08-04 21:39:10 -04:00
ilia 198bdc69e2 Sprint B: mobile filters, touch actions, skeleton grid, progressive viewer. 2026-08-04 21:37:33 -04:00
ilia 7a6fe89e06 Switch viewer PM2 template to next start and add deploy-viewer.sh.
DEV should build once then run production Next.js instead of long-lived next dev.
2026-08-04 21:35:04 -04:00
ilia 66e5ec3a45 Slim gallery face payloads for home SSR and search API.
Grid only needs location + person names; drop landmarks/pose/detector fields.
2026-08-04 21:34:23 -04:00
ilia d0b9a0c40d Fix match-all people/tags filters in gallery search API.
Raw SQL uses GROUP BY + HAVING for peopleMode/tagsMode=all; add unit tests.
2026-08-04 21:33:49 -04:00
ilia 5b00f3a3ab Merge pull request 'Fix sidebar contrast and gallery scroll restore' (#81) from fix/sidebar-contrast-scroll-restore into master
CI / skip-ci-check (push) Successful in 34s
CI / python-lint (push) Successful in 33s
CI / docker-ci (push) Successful in 41s
CI / secret-scan (push) Successful in 50s
CI / viewer-unit (push) Successful in 4m34s
CI / e2e (push) Successful in 4m30s
CI / admin-unit (push) Successful in 4m49s
2026-08-04 20:25:59 -05:00
ilia 212406187f Capture gallery scrollY at photo click before Next resets it.
CI / skip-ci-check (pull_request) Successful in 29s
CI / python-lint (pull_request) Successful in 32s
CI / docker-ci (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 36s
CI / viewer-unit (pull_request) Successful in 1m41s
CI / admin-unit (pull_request) Successful in 2m0s
CI / e2e (pull_request) Successful in 3m26s
2026-08-04 21:24:34 -04:00
ilia 1415b0efbd Fix filter sidebar contrast and restore gallery scroll after photo close.
CI / skip-ci-check (pull_request) Successful in 29s
CI / python-lint (pull_request) Successful in 32s
CI / docker-ci (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 35s
CI / viewer-unit (pull_request) Successful in 4m0s
CI / e2e (pull_request) Successful in 4m13s
CI / admin-unit (pull_request) Successful in 4m30s
Labels used text-secondary (a background token); switch to sidebar foreground. Keep lazy-loaded photos and freeze/restore scrollY when the modal opens.
2026-08-04 21:20:25 -04:00
ilia 8b675ae7bd Merge pull request 'Fix Identify Tab and watermarked thumbnails' (#80) from fix/identify-tab-and-watermark-thumbs into master
CI / skip-ci-check (push) Successful in 29s
CI / docker-ci (push) Successful in 31s
CI / python-lint (push) Successful in 31s
CI / secret-scan (push) Successful in 36s
CI / viewer-unit (push) Successful in 1m42s
CI / admin-unit (push) Successful in 1m58s
CI / e2e (push) Successful in 2m37s
2026-08-04 15:21:12 -05:00
ilia 6d01976811 Fix Identify Tab field order and watermarked thumbnail composites.
CI / skip-ci-check (pull_request) Successful in 29s
CI / python-lint (pull_request) Successful in 31s
CI / docker-ci (pull_request) Successful in 31s
CI / secret-scan (pull_request) Successful in 34s
CI / e2e (pull_request) Successful in 4m10s
CI / viewer-unit (pull_request) Successful in 4m16s
CI / admin-unit (pull_request) Successful in 4m32s
Tab/Enter stay inside the person form; thumbs size watermarks to the resized image so sharp.composite no longer fails.
2026-08-04 14:55:13 -04:00
ilia 9bbf0015a9 Merge pull request 'Apply Chabad Blue theme (light + inverted dark)' (#79) from feature/chabad-blue-theme into master
CI / skip-ci-check (push) Successful in 29s
CI / python-lint (push) Successful in 30s
CI / docker-ci (push) Successful in 32s
CI / secret-scan (push) Successful in 34s
CI / viewer-unit (push) Successful in 2m3s
CI / admin-unit (push) Successful in 3m12s
CI / e2e (push) Successful in 4m36s
2026-08-04 13:47:57 -05:00
ilia 472c800948 Keep Auto-Match Prev/Next fixed and add match-list filters.
CI / skip-ci-check (pull_request) Successful in 30s
CI / docker-ci (pull_request) Successful in 31s
CI / python-lint (pull_request) Successful in 35s
CI / secret-scan (pull_request) Successful in 38s
CI / admin-unit (pull_request) Successful in 1m42s
CI / viewer-unit (pull_request) Successful in 2m54s
CI / e2e (pull_request) Successful in 3m17s
Constrain panel height so bottom nav matches top Prev/Next; filter by similarity, quality, selection, and sort.
2026-08-04 14:42:37 -04:00
ilia 10cbc9330b Surface select-all-on-screen controls on Approve Identified.
CI / skip-ci-check (pull_request) Successful in 37s
CI / python-lint (pull_request) Successful in 32s
CI / viewer-unit (pull_request) Successful in 5m10s
CI / docker-ci (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 34s
CI / e2e (pull_request) Successful in 4m50s
CI / admin-unit (pull_request) Successful in 5m42s
Toolbar buttons plus Approve-column header checkboxes for all rows on screen.
2026-08-04 14:34:27 -04:00
ilia 60a767bd65 Stack Identify person fields so Tab moves down, not sideways.
CI / skip-ci-check (pull_request) Successful in 32s
CI / python-lint (pull_request) Successful in 34s
CI / viewer-unit (pull_request) Successful in 3m25s
CI / admin-unit (pull_request) Successful in 5m40s
CI / e2e (pull_request) Successful in 5m38s
CI / docker-ci (pull_request) Successful in 33s
CI / secret-scan (pull_request) Successful in 36s
Single-column layout for create-person inputs; Enter also advances to the next field.
2026-08-04 14:32:32 -04:00
ilia cd74c045f1 Apply Chabad Blue theme with inverted dark mode.
CI / skip-ci-check (pull_request) Successful in 37s
CI / python-lint (pull_request) Successful in 34s
CI / docker-ci (pull_request) Successful in 44s
CI / secret-scan (pull_request) Successful in 34s
CI / viewer-unit (pull_request) Successful in 2m1s
CI / admin-unit (pull_request) Successful in 2m40s
CI / e2e (pull_request) Failing after 10m20s
Site uses navy/white/quiet-gold tokens and Heebo + Rubik; dark mode is the inverted Chabad Blue canvas.
2026-08-04 14:30:39 -04:00
ilia 27e446a91a Merge pull request 'Style picker: 12 directions + full page mockups' (#77) from feature/styles-picker-page-mockups into master
CI / skip-ci-check (push) Successful in 29s
CI / docker-ci (push) Successful in 31s
CI / python-lint (push) Successful in 31s
CI / secret-scan (push) Successful in 36s
CI / viewer-unit (push) Successful in 1m41s
CI / admin-unit (push) Successful in 1m58s
CI / e2e (push) Successful in 2m58s
2026-08-04 13:02:08 -05:00
ilia cadf94f4c1 Expand style picker: 12 directions with per-page mockups.
CI / skip-ci-check (pull_request) Successful in 29s
CI / docker-ci (pull_request) Successful in 31s
CI / python-lint (pull_request) Successful in 33s
CI / secret-scan (pull_request) Successful in 38s
CI / viewer-unit (pull_request) Successful in 1m45s
CI / admin-unit (pull_request) Successful in 2m2s
CI / e2e (pull_request) Successful in 2m45s
Add Matchmaker Arcade, Parade Mosaic, and Orbit Kin; show Home, Photo, Search, Identify, Upload, and Login for each style.
2026-08-04 13:57:26 -04:00
ilia 70f89ae7ad Merge pull request 'Fix dark-mode JRCC logo (white + transparent)' (#76) from fix/jrcc-dark-logo-transparent into master
CI / skip-ci-check (push) Successful in 29s
CI / python-lint (push) Successful in 31s
CI / docker-ci (push) Successful in 31s
CI / secret-scan (push) Successful in 34s
CI / e2e (push) Successful in 4m30s
CI / viewer-unit (push) Successful in 4m37s
CI / admin-unit (push) Successful in 4m51s
2026-08-04 12:51:54 -05:00
ilia 366072fb92 Fix dark-mode JRCC logo: white ink on transparent background.
CI / skip-ci-check (pull_request) Successful in 29s
CI / docker-ci (pull_request) Successful in 31s
CI / python-lint (pull_request) Successful in 31s
CI / secret-scan (pull_request) Successful in 39s
CI / viewer-unit (pull_request) Successful in 1m41s
CI / admin-unit (pull_request) Successful in 1m57s
CI / e2e (pull_request) Successful in 2m41s
The previous dark asset was opaque white-boxed grayscale, so it showed as a white rectangle on dark headers.
2026-08-04 13:15:43 -04:00
ilia 669bb83d16 Merge pull request 'JRCC logos (light/dark) + watermark + 9-style picker' (#75) from feature/jrcc-brand-styles into master
CI / skip-ci-check (push) Successful in 29s
CI / docker-ci (push) Successful in 30s
CI / python-lint (push) Successful in 31s
CI / secret-scan (push) Successful in 35s
CI / viewer-unit (push) Successful in 1m35s
CI / admin-unit (push) Successful in 1m52s
CI / e2e (push) Successful in 3m21s
2026-08-04 12:07:57 -05:00
ilia aee2add5cd Allow brand PNGs to be tracked despite *.png gitignore.
CI / skip-ci-check (pull_request) Successful in 29s
CI / docker-ci (pull_request) Successful in 31s
CI / secret-scan (pull_request) Successful in 34s
CI / python-lint (pull_request) Successful in 32s
CI / admin-unit (pull_request) Successful in 2m17s
CI / viewer-unit (pull_request) Successful in 2m21s
CI / e2e (pull_request) Successful in 3m12s
2026-08-04 12:42:11 -04:00
ilia 9ba8e7a214 Add JRCC light/dark logos, watermark, and 9-style picker
CI / skip-ci-check (pull_request) Successful in 29s
CI / python-lint (pull_request) Successful in 30s
CI / docker-ci (pull_request) Successful in 31s
CI / secret-scan (pull_request) Successful in 35s
CI / e2e (pull_request) Successful in 5m31s
CI / viewer-unit (pull_request) Successful in 5m38s
CI / admin-unit (pull_request) Successful in 5m51s
Use bilingual classic mark for light headers and white/blue-gold for dark,
replace JAM watermark with JRCC overlay, and ship /styles so we can pick a
redesign direction.
2026-08-04 12:41:32 -04:00
ilia 4f628a8e53 Merge pull request 'Person contact fields, approve bulk select, pending-queue digest' (#74) from feature/person-contact-pending-digest into master
CI / skip-ci-check (push) Successful in 29s
CI / docker-ci (push) Successful in 32s
CI / python-lint (push) Successful in 31s
CI / secret-scan (push) Successful in 35s
CI / viewer-unit (push) Successful in 1m41s
CI / admin-unit (push) Successful in 1m57s
CI / e2e (push) Successful in 3m20s
2026-08-04 11:27:34 -05:00
ilia c64a97d147 Add person email/phone, approve bulk select, and pending-queue digest
CI / skip-ci-check (pull_request) Successful in 29s
CI / python-lint (pull_request) Successful in 31s
CI / docker-ci (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 37s
CI / e2e (pull_request) Successful in 4m32s
CI / viewer-unit (pull_request) Successful in 4m42s
CI / admin-unit (pull_request) Successful in 5m6s
Capture optional contact fields on identify/approve, add Select All and
Approve Next 10 on User Identified Faces, and email admins when the
pending queue grows (ADMIN_NOTIFY_EMAIL via existing noreply SMTP).
2026-08-04 12:20:39 -04:00
ilia 91fbc3f6e6 Merge pull request 'Add MIT LICENSE' (#73) from chore/add-license into master
CI / skip-ci-check (push) Successful in 29s
CI / docker-ci (push) Successful in 31s
CI / python-lint (push) Successful in 30s
CI / secret-scan (push) Successful in 34s
CI / viewer-unit (push) Successful in 1m38s
CI / admin-unit (push) Successful in 1m53s
CI / e2e (push) Failing after 2m4s
2026-07-26 15:52:17 -05:00
ilia 8ab4d33cef Add MIT LICENSE
CI / skip-ci-check (pull_request) Successful in 18s
CI / docker-ci (pull_request) Successful in 20s
CI / python-lint (pull_request) Successful in 23s
CI / secret-scan (pull_request) Successful in 25s
CI / admin-unit (pull_request) Successful in 33s
CI / viewer-unit (pull_request) Successful in 2m55s
CI / e2e (pull_request) Successful in 3m40s
2026-07-26 15:46:28 -05:00
ilia 2b6065e486 Merge pull request 'Finish IP scrub repo-wide, make Python lint gate real (ruff)' (#72) from dev into master
CI / skip-ci-check (push) Successful in 27s
CI / docker-ci (push) Successful in 34s
CI / secret-scan (push) Successful in 43s
CI / python-lint (push) Successful in 22s
CI / admin-unit (push) Successful in 1m27s
CI / viewer-unit (push) Successful in 2m6s
CI / e2e (push) Failing after 8m6s
2026-07-26 15:15:23 -05:00
ilia c51df649b6 ci: fix python-lint job for containers without node (manual clone)
CI / skip-ci-check (push) Successful in 28s
CI / skip-ci-check (pull_request) Successful in 22s
CI / docker-ci (push) Successful in 23s
CI / secret-scan (push) Successful in 34s
CI / python-lint (push) Successful in 41s
CI / admin-unit (push) Successful in 48s
CI / viewer-unit (push) Successful in 1m19s
CI / docker-ci (pull_request) Successful in 23s
CI / python-lint (pull_request) Successful in 21s
CI / secret-scan (pull_request) Successful in 31s
CI / admin-unit (pull_request) Successful in 45s
CI / viewer-unit (pull_request) Successful in 1m53s
CI / e2e (push) Successful in 4m56s
CI / e2e (pull_request) Successful in 4m34s
2026-07-26 16:04:40 -04:00
ilia fc3960afa9 lint: replace no-op flake8 script with gating ruff check, fix findings
CI / skip-ci-check (push) Successful in 18s
CI / python-lint (push) Failing after 19s
CI / docker-ci (push) Successful in 21s
CI / secret-scan (push) Successful in 30s
CI / skip-ci-check (pull_request) Successful in 27s
CI / python-lint (pull_request) Failing after 21s
CI / docker-ci (pull_request) Successful in 22s
CI / admin-unit (push) Successful in 44s
CI / secret-scan (pull_request) Successful in 45s
CI / admin-unit (pull_request) Successful in 55s
CI / viewer-unit (push) Successful in 1m54s
CI / viewer-unit (pull_request) Successful in 1m45s
CI / e2e (push) Failing after 6m5s
CI / e2e (pull_request) Successful in 6m43s
2026-07-26 16:01:28 -04:00
ilia abb7b34700 docs: finish homelab IP scrub across repo, add e2e env-defaults local override 2026-07-26 15:56:57 -04:00
ilia 688c6f7d8e Merge pull request 'Sync master: scrub public docs, untrack internal notes/caches, roadmap update' (#71) from dev into master
CI / skip-ci-check (push) Successful in 19s
CI / docker-ci (push) Successful in 20s
CI / secret-scan (push) Successful in 24s
CI / admin-unit (push) Successful in 38s
CI / viewer-unit (push) Successful in 1m4s
CI / e2e (push) Successful in 3m30s
2026-07-26 14:52:54 -05:00
ilia d6b546c95e chore: deduplicate env templates into .env.example
CI / skip-ci-check (push) Successful in 18s
CI / docker-ci (push) Successful in 19s
CI / secret-scan (push) Successful in 32s
CI / viewer-unit (push) Successful in 2m42s
CI / admin-unit (push) Successful in 3m22s
CI / e2e (push) Successful in 4m17s
CI / skip-ci-check (pull_request) Successful in 18s
CI / docker-ci (pull_request) Successful in 21s
CI / secret-scan (pull_request) Successful in 31s
CI / viewer-unit (pull_request) Successful in 1m30s
CI / admin-unit (pull_request) Successful in 2m26s
CI / e2e (pull_request) Failing after 7m8s
2026-07-26 15:30:17 -04:00
ilia 6be4877666 chore: untrack internal notes and Vite cache, ignore logs 2026-07-26 15:29:31 -04:00
ilia 86d2b476b0 docs: scrub homelab IPs and default credentials, reduce emoji noise 2026-07-26 15:29:13 -04:00
ilia 5f8f2e0bee Update roadmap 2026-07-26 15:27:17 -04:00
ilia 23f0616646 Merge pull request 'security: remove plaintext credentials from .cursorrules' (#70) from security/scrub-cursorrules-creds into dev
CI / skip-ci-check (push) Successful in 5s
CI / docker-ci (push) Successful in 6s
CI / secret-scan (push) Successful in 19s
CI / admin-unit (push) Successful in 20s
CI / viewer-unit (push) Successful in 40s
CI / e2e (push) Successful in 1m55s
2026-07-15 17:42:55 -05:00
ilia 586243cd56 security: remove plaintext dev/Postgres passwords from .cursorrules
CI / skip-ci-check (pull_request) Successful in 5s
CI / docker-ci (pull_request) Successful in 7s
CI / secret-scan (pull_request) Successful in 17s
CI / admin-unit (pull_request) Successful in 22s
CI / viewer-unit (pull_request) Successful in 42s
CI / e2e (pull_request) Successful in 1m50s
These were committed in cleartext and pushed to remote history. Rotate the
dev server SSH password and Postgres 'ladmin' password separately; this
only stops the leak going forward and points at Infisical/vault instead.
2026-07-15 18:38:40 -04:00
ilia da4fc72807 Merge pull request 'test: timing budgets + CI hardening (artifact v3 pin, npm cache retry)' (#69) from test/timing-budgets-ci-hardening into dev
CI / skip-ci-check (push) Successful in 5s
CI / docker-ci (push) Successful in 7s
CI / secret-scan (push) Successful in 15s
CI / admin-unit (push) Successful in 33s
CI / viewer-unit (push) Successful in 1m3s
CI / e2e (push) Successful in 3m10s
2026-07-15 08:03:20 -05:00
ilia c0c997f796 test: timing budgets + CI hardening (artifact v3 pin, npm cache retry)
CI / skip-ci-check (pull_request) Successful in 5s
CI / docker-ci (pull_request) Successful in 7s
CI / secret-scan (pull_request) Successful in 12s
CI / viewer-unit (pull_request) Successful in 1m29s
CI / e2e (pull_request) Successful in 4m8s
CI / admin-unit (pull_request) Successful in 4m24s
Closes three items from the outstanding e2e/CI gap list:

- Timing budgets: timings.measure() only ever recorded durations for the
  (still-unwired) Pushgateway export — nothing failed CI when a step got
  slow. Add e2e/timing-budgets.ts (expectWithinBudget + shared BUDGET_MS
  buckets) and wire it into every measure() call site across the suite.
  Mail-wait steps are deliberately left unbudgeted (external mail-trap
  delivery latency, not a code performance signal).

- actions/upload-artifact@v4 doesn't work against this Gitea/act runner's
  artifact backend — pin to v3 for the e2e failure-report upload.

- Shared act_runner npm cache has corrupted platform-native tarballs before
  (@next/swc-linux-x64-musl) and reds viewer-unit/admin-unit/e2e with no
  product bug involved. All three npm ci steps now retry once after
  `npm cache clean --force` on first failure.

Verified: full local suite green against DEV (37 passed, 6 skipped, no
budget assertion failures) before wiring into CI.
2026-07-15 08:56:31 -04:00
ilia 96351288f0 test: playkit v0.3.1 adoption, Zod widening, PROD smoke, NextAuth write gates (#68)
CI / skip-ci-check (push) Successful in 4s
CI / docker-ci (push) Successful in 6s
CI / secret-scan (push) Successful in 11s
CI / admin-unit (push) Successful in 1m23s
CI / viewer-unit (push) Successful in 2m2s
CI / e2e (push) Successful in 2m43s
2026-07-14 22:24:07 -05:00
ilia 72e89aef9f docs: playkit gaps + next e2e ideas (#67)
CI / skip-ci-check (push) Successful in 4s
CI / docker-ci (push) Successful in 6s
CI / secret-scan (push) Successful in 11s
CI / e2e (push) Failing after 3m3s
CI / viewer-unit (push) Successful in 3m9s
2026-07-14 20:26:33 -05:00
ilia e60abd9263 Merge pull request 'test: FastAPI e2e role-permission gates + gallery search filters' (#66) from test/fastapi-e2e-role-search into dev
CI / skip-ci-check (push) Successful in 5s
CI / docker-ci (push) Successful in 5s
CI / secret-scan (push) Successful in 11s
CI / viewer-unit (push) Successful in 2m30s
CI / e2e (push) Successful in 2m33s
2026-07-14 19:47:07 -05:00
ilia e78fad692f test: FastAPI e2e role-permission gates + gallery search filter coverage
CI / skip-ci-check (pull_request) Successful in 5s
CI / docker-ci (pull_request) Successful in 5s
CI / secret-scan (pull_request) Successful in 10s
CI / viewer-unit (pull_request) Successful in 2m33s
CI / e2e (pull_request) Successful in 2m38s
- Wire E2E_API_USERNAME/PASSWORD (admin) + E2E_API_VIEWER_USERNAME/PASSWORD
  (viewer) into the Gitea Actions e2e job so FastAPI-authed specs run in CI.
- Add api.role-permissions.spec.ts: viewer 403 vs admin 200/200/200 on
  /api/v1/users, /api/v1/role-permissions, and /api/v1/photos/bulk-delete
  (safe no-op via a non-existent photo id — proves the gate, not deletion).
- Add gallery.search-filters.spec.ts: tag_id and person_id filters on the
  public /api/search route return correct subsets, combined filters narrow
  results, and the /search UI tag-filter interaction updates the URL/count.
- Update ROADMAP/README/.env.example for the new env vars and coverage.
2026-07-14 20:42:47 -04:00
ilia c31c76b5a8 Merge pull request #65 from test/e2e-gaps-roadmap
CI / skip-ci-check (push) Successful in 8s
CI / docker-ci (push) Successful in 7s
CI / secret-scan (push) Successful in 16s
CI / e2e (push) Successful in 1m23s
CI / viewer-unit (push) Failing after 14m57s
Fill e2e gaps and ROADMAP (#65)
2026-07-14 18:28:59 -05:00
ilia 4ef8fcc7e7 Track e2e fixture PNG (gitignore exception)
CI / skip-ci-check (pull_request) Successful in 8s
CI / docker-ci (pull_request) Successful in 7s
CI / secret-scan (pull_request) Successful in 15s
CI / viewer-unit (pull_request) Successful in 1m32s
CI / e2e (pull_request) Successful in 1m55s
2026-07-14 19:19:49 -04:00
ilia d9910acdde Fill e2e gaps: storageState, real upload POST, session smoke
CI / skip-ci-check (pull_request) Successful in 3s
CI / docker-ci (pull_request) Successful in 5s
CI / secret-scan (pull_request) Successful in 12s
CI / viewer-unit (pull_request) Successful in 3m11s
CI / e2e (pull_request) Failing after 5m24s
Add auth setup project, viewer session check, upload that posts a fixture,
FastAPI login spec (skips without E2E_API_*), and repo ROADMAP.md.
2026-07-14 19:17:14 -04:00
ilia 988e9accf8 Merge pull request 'Expand e2e auth, Vitest CI, env-defaults, API catalog' (#64) from test/e2e-auth-vitest-ci into dev
CI / skip-ci-check (push) Successful in 4s
CI / docker-ci (push) Successful in 6s
CI / secret-scan (push) Successful in 11s
CI / viewer-unit (push) Successful in 2m39s
CI / e2e (push) Successful in 4m13s
2026-07-14 18:11:05 -05:00