Luminary is a VS Code extension built around a user-selected media root.
The extension does not assume a fixed machine path. Instead, the user points Luminary at a folder and the extension builds a local working model from that root.
extension.jsWires together the scanner, stores, engines, and UI providers.lib/media-scanner.jsWalks the media root, builds the timeline model, and maintains the scan cache.lib/tag-store.jsPersists file tag assignments.lib/people-store.jsPersists people records and saved face descriptors.lib/duplicate-detector.jsFinds exact duplicates by grouping by size and then hashing candidate files.lib/export-engine.jsHandles full-resolution copy export and resized zip export.lib/facebook-parser.jsReads Facebook export HTML and recovers dates for imported media.providers/VS Code-facing panels and views for timeline browsing, month grids, duplicates, tags, export, face recognition, and Facebook import.
Luminary stores working data inside the selected media root:
.luminary/scan-cache.json.luminary/tags.json.luminary/people.json
This is intentional.
It keeps the project portable and avoids binding the extension to a single workstation layout.
Face recognition runs in a separate Node.js worker process.
Why:
- VS Code runs extensions inside an Electron host
- native TensorFlow bindings are sensitive to ABI differences
- spawning the system
nodeprocess avoids loading the native backend inside the extension host itself
Backend order:
@tensorflow/tfjs-node-gpu@tensorflow/tfjs-node@tensorflow/tfjs
The native backends are optional. Luminary should remain usable without them.
- scans are read-only
- duplicate removal requires explicit confirmation
- duplicate removal uses OS trash when available
- export writes copies
- Facebook import writes to a chosen target folder, not back into the source export
When changing Luminary, keep these rules intact:
- no hardcoded machine paths
- no dependence on private workspace layout
- local-first behavior by default
- sidecar storage should remain understandable and recoverable