Read. Group. Interpret.
MemorialAtlas is a focused project for the Symfony AI & MCP Hackathon. The technical challenge starts with an ordered photostream: one marker may appear in several photographs, and one photograph may contain several names. OCR alone produces fragments. We need to associate those fragments with physical markers before turning them into useful records.
1. OCR each photograph
We preserve the original image, read its inscription with OCR, and retain available capture metadata, including latitude and longitude. Hosted Mistral OCR and a separate Mistral-compatible RustO endpoint are independently configurable. OCR text stays attached to its source photograph.
2. Does the next photo belong to the same marker?
Jev compares consecutive photographs using OCR text, capture order, available latitude and longitude, and any recorded visual descriptions. Matching names and dates can connect a close-up to the previous photograph. Location provides supporting context: nearby GPS coordinates alone cannot distinguish adjacent graves, and camera positions can drift.
The comparison proposes whether two photographs show the same physical marker, different markers, or an uncertain relationship. These are review suggestions; the current capture-review command does not automatically merge records. Different people may share a marker, and the same person may have both a headstone and a footstone.
3. Combine the text and extract meaning
Once photographs are grouped into a marker record, structured extraction uses their combined OCR text and available observations to propose names, birth and death dates, inscriptions, and relationship clues. It preserves ambiguities rather than filling gaps with guesses. An explicit marriage inscription is evidence of a relationship; simply appearing together is not enough.
Saved claims retain available provider and model provenance. The record page presents the photographs, OCR, descriptions and AI assessment history together. Extracted names are not automatically resolved person identities; cemetery context helps constrain later genealogy and name resolution.
Optional image analysis: accuracy and cost
The baseline workflow can run on OCR and text alone. Optional image analysis examines the photographs themselves, adding evidence about layout, marker shape and visual details. This can substantially improve difficult readings and grouping decisions, but requires additional model calls, processing time and cost.
Uniform markers may gain little from that extra step. Varied, worn or unusually arranged markers can benefit much more. Vision can be disabled for a text-only run, and the chosen processing policy is recorded.
The stack and the data
Symfony and Doctrine manage records and processing workflows. Elasticsearch indexes the combined evidence for search. API Platform exposes a public, read-only API with interactive documentation, so genealogy projects can reuse the data while retaining source identifiers. FollowTheMoney-based genealogy and other open-source family-tree tools are potential consumers.
The public Sperryville demo on Hugging Face contains a photograph and its saved OCR and extraction results. Developers can load it without our S3 credentials or paid AI calls. It is a small example, not the full cemetery collection.