Three things: a phone new enough, an Opensolr account, and a few permissions. The plan decides how much of the experience you get.
API level 26. The app is a regular APK, installed from GitHub.
The app signs in with it and creates the phone's index in it. Create one.
Every phone uses one Opensolr Index. If the plan's index allowance is full, the app says so and links to the plans.
Sync and search talk to Opensolr. Scheduled syncs wait for a connection by themselves.
Photos are embedded; search matches meaning and words.
Each new photo uses 2 with vector search (read + embed), 1 without. A typed search by meaning uses 1. Photos already indexed never cost again. See plan limits.
Hold and serve the photo descriptions. When either runs out, the index pauses until you upgrade or the month resets.
READ_MEDIA_IMAGES (or storage access on Android 12 and older), to find and read the photos in your folders.
ACCESS_MEDIA_LOCATION. Without it Android removes GPS data from photos before the app sees them, and photos are indexed without a place.
ACCESS_COARSE_LOCATION, read once when this phone's index is created, to put the index on the Opensolr environment nearest to you (Chicago for the Americas, Finland for everyone else). The position never leaves the phone; without it the phone's time zone decides.
Sync progress and plan alerts.
Talking to Opensolr.
So Android does not stop a long sync half way.