The canonical archive
Preserved throughoutEach manifest records the original’s size and SHA-256. The supplied metadata JSON is retained as another hashed resource.
Archive Lab / An inspectable engineering proof
A useful archive keeps the original bytes and the record of what they are. Its search index can be built again.
Here, three generated images put that boundary to a real test. You can also check the files yourself.
Check the three originals01 / Actual CLI execution, recorded
The unchanged Photo Archive CLI staged these originals, verified them, and rebuilt its index after that disposable file was removed. These controls select the saved evidence.
Each manifest records the original’s size and SHA-256. The supplied metadata JSON is retained as another hashed resource.
archive.sqlite
3asset rows
6resource rows
okintegrity check
Three asset rows and six resource rows: one original PNG and one retained metadata JSON for each asset.
Recorded evidence. These controls execute no commands.
Initial index: 3 assets, 6 resources, SQLite integrity ok.
$ photo-archive rebuild-index $DEMO_ROOT/archive --destination $DEMO_ROOT/state/archive.sqlite
{"assets": 3, "path": "$DEMO_ROOT/state/archive.sqlite"}
$ photo-archive verify $DEMO_ROOT/archive
{"assets": 3, "resources": 6, "status": "ok"}3 original PNGsSame sizes and SHA-256 hashes
13 canonical filesByte-identical before and after
Identical database rowsAssets, resources and identities
02 / A separate check, in your browser
Fetch the three tiny synthetic PNGs and calculate their SHA-256 hashes locally with Web Crypto. Compare your results with the recorded originals.
This browser illustration is separate from the CLI run above. It has no archive backend, uploads or saved browser state.
The recorded hashes are below. Enable JavaScript to calculate and compare hashes in this browser.
3,762 bytes · generated PNG · Download original
5161464036288618fe892205908aa323b2420329b7ec00d7f4bccd2aa94a46deNot calculated4,713 bytes · generated PNG · Download original
9694257a1438544959d0068a97fef66f83d5ddd7f0d27ea92f02d9104cf484a5Not calculated3,359 bytes · generated PNG · Download original
6c329d5b536526360e4db3ab8563dccb0b8018a824c2fc143611ac90f62229b1Not calculatedChanging a copied byte affects one temporary array in memory. The hosted PNG, your download and the original archive evidence stay unchanged.
03 / Source, hashes and scope
7ecfaf029f48a41323e42f80e6f2fe238e99d60aThe actual Typer CLI ran through a guarded Python launcher. Commands below use its photo-archive entrypoint name. Only the disposable data-root prefix is replaced with $DEMO_ROOT. Refusal messages are labeled excerpts; full private tracebacks are omitted.
$ photo-archive init-volume $DEMO_ROOT/archive initialized $DEMO_ROOT/archive
$ photo-archive init-volume $DEMO_ROOT/archive [stderr excerpt] FileExistsError: [Errno 17] File exists:
$ photo-archive stage-osxphotos $DEMO_ROOT/archive --source-library-uuid SYNTHETIC-DEMO-LIBRARY --metadata-json $DEMO_ROOT/metadata/DE000001-2026-4000-8000-000000000001.json --resource $DEMO_ROOT/fixtures/DE000001-2026-4000-8000-000000000001.png
{"archive_id": "PFA1-DE000001-2026-4000-8000-000000000001", "state": "archive_verified", "resources": 2}$ photo-archive stage-osxphotos $DEMO_ROOT/archive --source-library-uuid SYNTHETIC-DEMO-LIBRARY --metadata-json $DEMO_ROOT/metadata/DE000002-2026-4000-8000-000000000002.json --resource $DEMO_ROOT/fixtures/DE000002-2026-4000-8000-000000000002.png
{"archive_id": "PFA1-DE000002-2026-4000-8000-000000000002", "state": "archive_verified", "resources": 2}$ photo-archive stage-osxphotos $DEMO_ROOT/archive --source-library-uuid SYNTHETIC-DEMO-LIBRARY --metadata-json $DEMO_ROOT/metadata/DE000003-2026-4000-8000-000000000003.json --resource $DEMO_ROOT/fixtures/DE000003-2026-4000-8000-000000000003.png
{"archive_id": "PFA1-DE000003-2026-4000-8000-000000000003", "state": "archive_verified", "resources": 2}$ photo-archive verify $DEMO_ROOT/archive
{"assets": 3, "resources": 6, "status": "ok"}$ photo-archive rebuild-index $DEMO_ROOT/archive $DEMO_ROOT/state/archive.sqlite [stderr excerpt] Got unexpected extra argument(s)
$ photo-archive rebuild-index $DEMO_ROOT/archive --destination $DEMO_ROOT/state/archive.sqlite
{"assets": 3, "path": "$DEMO_ROOT/state/archive.sqlite"}$ photo-archive rebuild-index $DEMO_ROOT/archive --destination $DEMO_ROOT/state/archive.sqlite
{"assets": 3, "path": "$DEMO_ROOT/state/archive.sqlite"}$ photo-archive verify $DEMO_ROOT/archive
{"assets": 3, "resources": 6, "status": "ok"}Between the initial and rebuilt index, the guarded driver removed only $DEMO_ROOT/state/archive.sqlite. Its recorded file identity and both database snapshots are in the public receipt.
The four named source files below match the committed revision and retain the same hashes after the run. Six focused, existing source tests passed: staging success and overwrite refusal, sentinel enforcement, resource verification and corruption rejection, and complete index reconstruction.
2833d01f8f72d9858c3d445c5e0497cadcb00d8bc78e6cb2fea922a60af48b3e69444ce08d3207cc9636c372300b4bee2161f480e21f7000ff275bd527b870dc1748e6fcbb55aedeecdefff8dc9fea48a7a603351dac377e66e4621c8cab26cdbee831edc5627ebdff625c9cd5524d0fd2ae529522613508b13e277963c4a21cThe 13 canonical files are three PNG originals, three retained metadata JSONs, three manifests, three event ledgers and one volume sentinel. Every file’s size and SHA-256 match before and after. The public receipt includes both complete file-identity snapshots and both index row sets.
The original source checkout remained unchanged. An explicit allowlist of committed code and narrow tests ran in an isolated copy. Three code-generated PNGs and minimal invented metadata replaced all real library inputs. The original home directories and real-volume paths were hidden; the network namespace was isolated. No Photos API, production catalog, archive server, model or enrichment operation ran.
Initializing the existing volume returned exit 1 without changing it. A positional index-destination sample returned exit 2 without creating a database; the successful commands use --destination. Staging retains a metadata JSON as a second resource, so three originals correctly yield six total resource rows. These are observations from the unchanged source.
Two test setup attempts encountered the sandbox’s read-only device restriction; disabling pytest capture and logging resolved them. The same six source tests then passed. Full private setup and failure receipts are retained outside this public exhibit.
This film records the private static prototype replaying the completed run’s evidence. The CLI commands had already finished. The display pacing is editorial; the film is not live CLI footage.
A narrow proof, deliberately
This run demonstrates original-byte preservation and reconstruction of a derived SQLite index from canonical manifests. It does not establish a second physical backup, long-term durability, Apple Photos behavior, production archive safety or machine-learning results.
Photo Archive is the storage boundary within a wider photo platform. This demonstration stays at that boundary.
Explore the memory district