This repository is a pnpm workspace. The main app is apps/web; photo processing lives in packages/builder; shared manifest/photo schema lives in packages/schema; pure media helpers live in packages/media.
Prerequisites:
- Node.js
^20.19.0 || >=22.12.0 - pnpm 10.19.0
Install dependencies:
pnpm install --frozen-lockfileFor a zero-credential first look, run pnpm dev:demo. It uses only the
committed synthetic fixture and never reads a private .env or generated
manifest.
pnpm dev
pnpm dev:demo
pnpm contracts
pnpm lint
pnpm format:check
pnpm type-check
pnpm test
pnpm buildpnpm dev and pnpm build run apps/web/scripts/precheck.ts first. With PHOTO_STORAGE_PROVIDER=local, precheck refreshes from LOCAL_PHOTOS_PATH without S3 credentials. In the default S3 mode, S3_BUCKET_NAME is required; the access key and secret are optional as a pair, and omitting both uses the AWS SDK default credential chain. Missing required configuration may reuse an existing manifest outside strict production builds.
pnpm build:manifestruns the builder and writesgenerated/photos-manifest.jsonplus generated thumbnails.pnpm build:webbuilds only the Vite app and expects a manifest to already exist.SKIP_MANIFEST_BUILD=true pnpm buildskips the builder intentionally.- Production web builds load data through
window.__AFILMORY__.manifest; the default production mode emits Web Delivery Manifest v3 (gallery-index, stable photo-detail shards, and a map shard) while the Builder's disk contract remains manifest v2. - Local-provider web builds copy
LOCAL_PHOTOS_PATHinto the static output underLOCAL_PHOTOS_BASE_URL; S3 originals remain remote.
Run:
pnpm contracts
pnpm lint
pnpm format:check
pnpm type-check
pnpm test:coverage
pnpm coverage:check:partitions
pnpm deploy:smokeFor photo viewer or WebGL changes, include the relevant viewer tests and @afilmory/webgl-viewer verification in the PR notes.
For UI changes, follow the styling contract, run
pnpm styles:check, and verify the affected interactions with real CSS in
the browser. Shared controls use the same tokens, surface recipes, and
keyboard focus boundary as the app.
When a schema or E2E fixture generator changes, run pnpm check:fixtures and
commit the deterministic synthetic result. Never derive test fixtures from a
real photo library: filenames, EXIF, URLs, and GPS are personal data.
Inbound contributions use the same terms as the path being changed, as mapped
by ANL-MANIFEST. By opening a pull request, you confirm that you have the right
to submit the contribution under those terms. The project does not require a
separate CLA.
DCO 1.1 sign-off is supported as an optional commit-level record of that
confirmation. Use git commit -s to add Signed-off-by: Name <email> when you
want that record. Because sign-off is optional, CI does not reject otherwise
valid contributions without it; the PR authorship confirmation remains
required. See licensing.md for the path classification.
Read the Security Policy before reporting a vulnerability and never post secrets, private manifests, photo URLs, or exact coordinates in an issue. All project spaces follow the Code of Conduct. Notable Project Code changes belong in the Unreleased section of CHANGELOG.md; releases follow releasing.md.