๐ฑ LibrePhotos Mobile
LibrePhotos Mobile is the official app. It stores a local copy of your library on the device, so you can browse your photos, albums, and people with no connection at all โ the network is used only to catch the app up with the server and to back up new photos from your phone.
It runs on Android and iOS.
LibrePhotos Mobile has not been published anywhere yet: there is no build on
the Google Play Store, the App Store, F-Droid, or TestFlight, and no .apk of it on
the GitHub releases page. Until it is, the only way to use it is to run it from
the source code, as described below. If you want an app you can install from a
store today, see UhuruPhotos.
Trying the appโ
The app lives in
apps/mobile/
of the LibrePhotos repository. To run it you need a computer with
Node.js 24 and a checkout of the repository:
git clone https://github.com/LibrePhotos/librephotos.git
cd librephotos
npm ci # installs the app and the shared API client
cd apps/mobile
Then pick one of two ways to get it onto your phone:
- Expo Go (quickest). Install the free Expo Go app
on your phone, run
npx expo start --goon the computer, and scan the QR code it prints. The phone has to reach the computer over the network, and Expo Go loads the app from it, so keepexpo startrunning while you use the app. This works on Android and on iPhone. - Development build (closer to a real install). On Android, with
Android Studio and a phone connected over USB (or an emulator), run
npx expo run:android. It builds the app and installs it on the device as LibrePhotos. Background backup and the share target behave best in a development build. On iOS a development build needs a Mac with Xcode and a paid Apple Developer account.
The developer guide and the
app README
cover the setup in more detail. Problems and feedback are welcome on the
issue tracker with the
mobile label.
First loginโ
When you first open the app you are asked for your server address before anything else โ this is a self-hosted app, so it needs to know where your LibrePhotos lives.
- In the Server field, enter the same address you use to reach LibrePhotos
in a browser, for example
photos.example.comor192.168.1.10:3000. The protocol is optional. - Wait for the connection check to succeed.
- Sign in with your LibrePhotos username and password.
Your login is stored securely on the device. After the first sign-in the app begins downloading a copy of your library in the background (see Offline mode).
Offline modeโ
After the first sync, the app keeps a local mirror of your library โ photos, albums, people, and shared items โ together with grid thumbnails. That means you can open the app in airplane mode and still:
- browse the full timeline and scroll through every photo's thumbnail,
- open albums, people, places, things, and tags,
- favorite, hide, trash/restore, rate, caption, and add or remove photos from albums.
Changes you make offline are saved immediately and queued. The next time the app is online it sends them to the server automatically. A star rating is written to the photo's file or XMP sidecar when Write edits to files is on, the same as a favorite set on the web.
Until this fix, a star rating set in the app showed on the phone but never reached the server. Saving ratings needs a build of the app that includes the fix and a server newer than 1.2.1 (1.3.0 or later); an older server rejects the rating and the app shows an error. Ratings set before the fix exist only on that phone, so set them again once both are updated.
Full-resolution originals are fetched on demand when you open a photo, so viewing an original still needs a connection unless it is a photo already on your device.
Backup setupโ
The app can back up new photos and videos from your phone's camera roll to your LibrePhotos server.
- Open the Backup tab.
- Grant photo-library access when prompted. On iOS you can grant access to all photos or a limited selection โ the app backs up whatever it is allowed to see.
- Choose which albums to back up (for example only your Camera roll).
- Set the conditions: back up on Wi-Fi only and/or only while charging.
Backup needs two things an admin sets up on the server:
- Uploads must be enabled. The
Allow uploadsswitch in the admin area has to be on. That switch is the authoritative setting; theALLOW_UPLOADenvironment variable only supplies its initial default (see Environment variables). - Your account needs a Scan Directory that exists on the server. Uploaded
files are saved in its
uploads/web/folder, or in theweb/folder inside the upload folder an admin set for you (see Upload folder). See How to Change Your Scan Directory.
If either is missing, the server rejects the upload.
The Backup tab shows progress and a per-item queue. Photos already on the server (matched by content, so duplicates are never re-uploaded) are skipped. A backed- up photo's badge flips from pending to synced once the server confirms it. Backup continues in the background within the limits your phone's operating system allows; keeping the app in the foreground is the fastest way to clear a large backlog.
Sync status and repairโ
Open Sync status (from Settings) to see what the app is doing:
- the last sync time and result,
- how many items were added, updated, or removed,
- a running log you can export to attach to a bug report.
Because the local copy is disposable, the app can always recover from a bad state by re-syncing from scratch. If counts ever drift from the server the app schedules this automatically, and you can trigger it yourself from the Sync status screen. A re-sync never loses server data โ it just rebuilds the local mirror.
Memories reminderโ
The app can remind you about your memories โ photos from this day in previous years. Enable the reminder in Settings to get a local notification; tapping it opens that day's memories. The reminder uses a local notification scheduled on the device, so it works without any push service.
Share targetโ
LibrePhotos Mobile registers as a share target. From another app โ Photos, a browser, a messaging app โ use the system Share sheet and pick LibrePhotos to send images into your library. On Android this works in a development build (not in Expo Go, which registers as its own app); on iOS the share extension is being finalized.