Skip to content

Keeper v1 — AI-assisted culling for photos and videos - #1

Merged
thisiscsim merged 1 commit into
mainfrom
feat/culling-v1
Jul 11, 2026
Merged

thisiscsim merged 1 commit into
mainfrom
feat/culling-v1

Conversation

@thisiscsim

Copy link
Copy Markdown
Owner

Summary

  • Pivots the repo from the Aperture video-studio scaffold to Keeper: import an SD card / phone dump into a local date-sorted library, auto-cull with explainable verdicts (blur/exposure/black-frame/accidental-clip via pure-JS CV over ffmpeg-piped grayscale), group bursts (pHash + capture time) with best-pick suggestions, pair RAW+JPEG and Live Photos, and search the whole library in natural language via local CLIP embeddings.
  • Adds the three-tier AI model: deterministic local pass → budgeted GPT-5.5 vision judge over borderline items only (downscaled thumbs, repaired-then-validated output) → agent skills (/cull-shoot, /find-media, /organize-library) working the same catalog through JSON CLIs. Every user override feeds taste.json (exemplars + threshold tuning + standing rules injected into future runs).
  • Rebuilds the app around the new contract: SQLite catalog (node:sqlite) validated by the new @keeper/schema zod package, brokered by a spawned catalog service; renderer on the inherited tokens/UI kit (lazy date grid, review queues with evidence crops, loupe with burst strip, keyboard-first culling with undo); export writes Lightroom-readable XMP sidecars; the only deletion path is a two-step empty-rejects to the OS Trash.
  • Removes the video-editor surface (Remotion, timeline, EDL, style library, TTS/ElevenLabs, bundled music) and rewrites README/AGENTS/CHANGELOG, .cursor/rules, and skills for Keeper.

Screenshots / recordings

Dev-booted twice with a smoke library (grid, queues, loupe render clean); no recordings attached — reviewer can npm run dev against any folder of photos.

Test plan

  • npm run typecheck passes (all workspaces)
  • npm test passes — 89 tests: schema hostile-input, quality/pHash/grouping/taste/XMP/LLM-repair/catalog, renderer store (verdicts/undo/selection/search order)
  • npm run build passes (resolves all CSS/asset imports)
  • Manually exercised end to end against generated fixtures: import (dedupe + checksums) → CV verdicts (blurry/black/accidental-clip correctly routed to sure-reject) → burst grouping → CLIP embedding + semantic search ranking → verdict CLI → taste.json exemplar recording → export with XMP sidecars → catalog-service RPC (queues, search, rejects flow)

Checklist

  • Catalog rows / taste.json validate against @keeper/schema (hostile-input tests included)
  • No secrets committed (app/.env.local, keys) and no large/uploaded media
  • CHANGELOG.md updated under "Unreleased"
  • Restart note: this touches main/preload/engine scripts — npm run dev must be restarted after pulling (HMR only covers the renderer). Node >= 22.13 required (node:sqlite).

Made with Cursor

Pivot the Aperture video-studio scaffold into the culling product: a local
date-sorted library with a checksummed/deduped import pipeline (EXIF, RAW/HEIC
thumbnails, video posters + scrub strips), a pure-JS CV pass (blur/exposure/
black-frame/accidental-clip) with explainable verdicts, pHash burst grouping
with best-pick suggestions, RAW+JPEG/Live Photo pairing, local CLIP semantic
search, a budgeted GPT-5.5 judge for borderline items, and a taste profile
that learns from every override.

Catalog is SQLite (node:sqlite) validated end-to-end by the new @keeper/schema
zod contracts, brokered to the app by a spawned catalog service; the renderer
is rebuilt on the inherited tokens/UI kit (lazy date grid, review queues with
evidence, loupe with burst strip, keyboard-first culling, undo). Export writes
Lightroom-readable XMP sidecars; the only deletion path is a two-step
empty-rejects that moves originals to the OS Trash.

Removes the video-editor surface (Remotion, timeline, EDL, style library,
TTS/ElevenLabs) and rewrites docs, rules, and skills for Keeper.

Co-authored-by: Cursor <cursoragent@cursor.com>
@thisiscsim
thisiscsim merged commit cdc472e into main Jul 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant