72c41ae834
Builds the "indexed library" foundation and first intelligent features on top of the organizer (sql.js index, non-destructive in-place indexing). Phase 0 — Library index: - sql.js (WASM SQLite) index DB; contentHash-keyed assets, resumable indexing (skip by path+mtime), batch persistence (chosen over native better-sqlite3 which fails to build on Node 24 / Python 3.12) - Library folders (in place, non-destructive) + background indexer w/ progress - Thumbnails generated in the AI worker (canvas->webp), cached in userData; served via photoai-media://thumb by hash; thumbnail grid w/ pagination Phase 1 — AI quality assessment & culling: - Focus (Laplacian variance), exposure (histogram), eyes-open (face-api EAR) computed in one analyze pass alongside the thumbnail - Culling filters (candidate/rejected) + quality badges - Adjustable thresholds (live SQL re-classification from stored raw scores, no re-analysis) + manual star rating (0-5) and color labels (usermeta) Phase 2 — CLIP natural-language / similarity search: - @huggingface/transformers (WASM/WebGPU, no native build) - CLIP image/text embeddings (lazy-loaded); Korean queries auto-translated via opus-mt-ko-en into the English CLIP - Embeddings stored as SQLite BLOBs; "build search index" batch w/ progress; brute-force cosine search; new Search tab - Note: models download from HF Hub on first use; fully-offline ORT-wasm packaging and KO search-accuracy tuning are follow-ups Tabs added (Organize / Library / Search). All typecheck/tests(12)/build green; boot smoke verified across phases. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
1.6 KiB
JSON
50 lines
1.6 KiB
JSON
{
|
|
"name": "ai-photo-organizer",
|
|
"version": "0.1.0",
|
|
"description": "Local-first AI photo organizer — face recognition + EXIF based auto archiving",
|
|
"author": "PhotoAI",
|
|
"license": "MIT",
|
|
"main": "./out/main/index.js",
|
|
"scripts": {
|
|
"dev": "electron-vite dev",
|
|
"build": "electron-vite build",
|
|
"start": "electron-vite preview",
|
|
"typecheck:node": "tsc --noEmit -p tsconfig.node.json",
|
|
"typecheck:web": "tsc --noEmit -p tsconfig.web.json",
|
|
"typecheck": "npm run typecheck:node && npm run typecheck:web",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"models:download": "node scripts/download-models.mjs",
|
|
"pack": "electron-vite build && electron-builder --dir",
|
|
"dist": "electron-vite build && electron-builder",
|
|
"dist:win": "electron-vite build && electron-builder --win",
|
|
"dist:mac": "electron-vite build && electron-builder --mac",
|
|
"dist:all": "electron-vite build && electron-builder --win --mac"
|
|
},
|
|
"dependencies": {
|
|
"@huggingface/transformers": "^3.8.1",
|
|
"@vladmandic/face-api": "^1.7.13",
|
|
"exifr": "^7.1.3",
|
|
"sql.js": "^1.12.0",
|
|
"zustand": "^4.5.5"
|
|
},
|
|
"devDependencies": {
|
|
"@types/node": "^20.16.0",
|
|
"@types/react": "^18.3.5",
|
|
"@types/react-dom": "^18.3.0",
|
|
"@types/sql.js": "^1.4.9",
|
|
"@vitejs/plugin-react": "^4.3.1",
|
|
"autoprefixer": "^10.4.20",
|
|
"electron": "^33.0.0",
|
|
"electron-builder": "^25.1.8",
|
|
"electron-vite": "^2.3.0",
|
|
"postcss": "^8.4.47",
|
|
"react": "^18.3.1",
|
|
"react-dom": "^18.3.1",
|
|
"tailwindcss": "^3.4.13",
|
|
"typescript": "^5.5.4",
|
|
"vite": "^5.4.8",
|
|
"vitest": "^2.1.1"
|
|
}
|
|
}
|