⚠️ Sailjail permissions updated (0.8.0): please read "sandbox permissions" section
Please read carefully the description
Nami is a privacy-first face recognition photo gallery for Sailfish OS. It scans your photo gallery, detects faces, and lets you tag and group photos by person, entirely on your device.
⚠️ This is a preliminary, experimental release (v0.8.0). Expect rough edges.
Source code: https://github.com/nicosouv/harbour-nami
This app is written by a human developer with an LLMs (Claude and Mistral Vibe). It is also an experiment: testing how to package a Sailfish OS app together with its ML models fully bundled, so it runs 100% offline out of the box.
The models are NOT downloaded at runtime. They are fetched during the CI build (SHA-256 checksum-verified) and shipped inside the RPM. Both come from the OpenCV Model Zoo:
- YuNet (face detection, MIT license)
Source: https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet
Direct file: https://media.githubusercontent.com/media/opencv/opencv_zoo/main/models/face_detection_yunet/face_detection_yunet_2023mar.onnx
- SFace (face recognition, Apache-2.0 license)
Source: https://github.com/opencv/opencv_zoo/tree/main/models/face_recognition_sface
Direct file: https://media.githubusercontent.com/media/opencv/opencv_zoo/main/models/face_recognition_sface/face_recognition_sface_2021dec.onnx
Nami requests the following sandbox permissions:
- Pictures: to scan your photo gallery.
- Documents: only for the data export feature, nothing more.
- RemovableMedia: so you can add SD card folders to the scan list. Nami only ever reads the folders you explicitly whitelist in Settings.
- Contacts + Privileged: required to read your address book for the optional "link a person to a contact" feature. On current Sailfish OS version, the contacts database lives in privileged storage, and reading it from a sandboxed app requires the Privileged permission, the Contacts permission alone gives access to an empty store. This is the same approach used by other apps (e.g. Fernschreiber).
About contacts, to be fully transparent:
- Access is strictly read-only: Nami never creates, modifies or deletes contacts.
- Nami only stores the numeric ID and display name of contacts you explicitly link.
- If you are not comfortable with this, a privacy toggle in Settings ("Contacts integration") completely disables any contact reading, even though the permission is granted. All contact-related UI disappears.
- As with everything else, nothing ever leaves your device: the app makes no network requests at runtime.
- All face detection and recognition runs locally on your device (C++ / OpenCV DNN). No cloud, no external API.
- The app makes no network requests at runtime: photos, face embeddings and names never leave your phone.
- Model files are checksum-verified at build time so you get exactly the published OpenCV Zoo models.
- Only Pictures and Documents permissions are needed. Documents is required for the data export feature, nothing more
- Face data: detected faces, biometric embeddings, the names you assign, and manual corrections is kept in a local SQLite database on the device only.
- The database is stored with owner-only file permissions (0600), so other user accounts or processes on the device cannot read it. Note: it is not encrypted, the security model relies on the device's own storage and lock-screen protection.
- The only app settings persisted are non-personal: the folder to scan, the recognition strictness threshold, and an internal embedding-format version. No names or biometric data are stored as settings.
- One-tap "Clear all data" (in Settings, with a confirmation) wipes every photo record, detected face, biometric embedding, person name and manual correction, then runs a database VACUUM to purge the deleted data from freed pages. It also deletes the cached face-crop images from disk.
- Data export: exports your local metadata (names, photo paths, detection dates and scores) as a readable JSON file, but never the raw biometric templates, since these have no human-readable value and shouldn't be reusable elsewhere
This is an early version, if the app doesn't work for you or you dislike something about it, I'm genuinely open to constructive criticism.
Please report issues or ideas on GitHub: https://github.com/nicosouv/harbour-nami/issues
| Attachment | Size | Date |
|---|---|---|
| 40.17 MB | 08/07/2026 - 13:56 | |
| 40.2 MB | 13/07/2026 - 15:25 | |
| 39.77 MB | 13/07/2026 - 15:25 | |
| 40.29 MB | 19/08/2026 - 00:42 | |
| 39.87 MB | 19/08/2026 - 00:42 |
- Fix a crash after identifying a face. It happened every time, whether you typed a new name or picked a contact from the address book.
- Fix the same crash when merging two people together.
- Fix the trip route map rendering as an empty sheet of paper.
- Land and sea are now filled in, instead of a bare coastline outline.
- When identifying a face, Nami now suggests the most likely people
- Name autocomplete while typing a new person
- Group several days into a named trip!
- Trip page: browse by day or by geographic stop, total route distance, and an offline route map. Still no network, no map service.
- Add more days to an existing trip, merge two trips, ungroup, or hide a day/trip from the Events list without touching the photos.
- Optional setting to include photos with no identified person in Events.
- Full backup and restore (on an offline file), encrypted with a passphrase you choose.
- Restoring finds your photos again by content hash even if they ended up at a different path on the new device.
- Restore is additive and safe to run on a database that already has data. Scan the gallery first, then restore. Contact links are not included in a backup
- Norwegian Bokmal translation, contributed by Frank Paul Silye, thanks!!
- ARMv7 build (untested cause I only have a C2 now) !
- Sailjail update: Contacts and Privileged permissions added! It's required to read your address book for the optional "link a person to a contact" feature. On current Sailfish OS version, the contacts database lives in privileged storage, and reading it from a sandboxed app requires the Privileged permission, the Contacts permission alone gives access to an empty store. This is the same approach used by other apps (e.g. Fernschreiber)
- Link people to your device contacts (adopts the contact's name, badge on linked people)
- Open the People app directly on the linked contact
- Link a face to a contact straight from the identify flow, or keep app-only people
- Duplicate merge suggestion when linking a contact already linked to someone else
- Privacy toggle to disable all contact reading
- People gallery in list, grid x2 or grid x4 layout
- Full context menu on long press in grid layout
- Scan folders of your choice, SD card supported
- Photos honor EXIF orientation; manual rotation persisted in the viewer
- Events fixed (no more empty events) and tapping one opens its photos
- Memories match a configurable day window (default 20) and open a polaroid-style spread
- Scan results show unknown faces first, with a note when everything was auto-matched
- Fix search fields losing focus while typing
- Fix rename and delete dialogs failing to open
- Fix removing a photo from a person not persisting
- About page: app logo, dynamic version, updated feature list
- Complete translations (en, fr, de, it, es, fi)
- Fix sailjail permissions
- Local, on-device face detection and recognition (YuNet + SFace, OpenCV DNN), no cloud, no network at runtime
- Automatic photo gallery scan with batch processing and progress, cancellable
- Face grouping, naming and tagging by person
- UI to identify and sort faces quickly
- Person pages with photo gallery, "view face in photo" highlight, and one-tap confirm of all matches
- Distinct badges for manual vs auto-matched faces, with similarity scores
- Person merge, incremental scan, and persistent manual corrections
- Configurable scan folder and recognition strictness
- Events and Memories views based on EXIF capture dates
- Face thumbnail provider with disk cache (avatars, identify flow)
- Full-screen photo viewer with pinch-to-zoom
- Full translations: English, French, German, Italian, Spanish, Finnish
- ML models bundled and SHA-256 checksum-verified at build time
Comments
mkz
Wed, 2026/08/19 - 01:33
Permalink
It works nice !! Thanxx a lot !
mkz
Tue, 2026/08/18 - 22:35
Permalink
Beautiful update! Thanx Nico !
Unfortunately app is crashing after each identification from contact of the address book...
Update : it crashes each time it add a new name in its database.
App tested on J2 SFOS 5.2.
nicosouv
Wed, 2026/08/19 - 00:46
Permalink
I finally figured it out! It was a nasty bug: the dialog was still holding on to something the app had already thrown away.
I removed the 0.8.3, and uploaded a 0.8.4 which is way better.
nicosouv
Tue, 2026/08/18 - 20:55
Permalink
Thanks! I'll take a look at it, I may have find the issue! Not sure I can reproduce correctly on my device, so I guess it'll be a "test" release :/
mkz
Wed, 2026/07/15 - 11:01
Permalink
Great ! Thanx a lot !
Contact link works fine ☺
Unfortunately, it doesn't show SD card path (or I can't find it).
nicosouv
Thu, 2026/07/16 - 10:31
Permalink
I added some settings about that. You may need to whitelist the SD card path. I know it is a little overkill but since I added the sailjail permission, I wanted users to be in full control about what the app is allowed to read.
Could you check the settings add the path and try again ? Thanks !
mkz
Sat, 2026/07/11 - 01:29
Permalink
Hi thanks for this amazing app.
Two requests/comments :
- should it possible to read pictures from SD in the future ?
- is it possible to connect Nami's persons to Contacts ?
Thanxxx a lot !
nicosouv
Mon, 2026/07/13 - 15:57
Permalink
It's now implemented in 0.8.0! But it needed a sailjail permission update, I put some settings incase someone does not want some functionnalities.
Let me know if it's ok for you :)
nicosouv
Sun, 2026/07/12 - 00:07
Permalink
Thanks for the feedback! I'm looking into that, I'll let you know!
dalas_revo
Wed, 2026/07/08 - 14:59
Permalink
Thanks for the quick fix!
dalas_revo
Wed, 2026/07/08 - 11:53
Permalink
Maybe it is a nice app, but I didn't dare to test it, although I'd very much like to. In the description, it is called privacy-first and it claims to not send any data. I think in that case all the superfluous permissions which it asks for should be removed.
nicosouv
Wed, 2026/07/08 - 13:58
Permalink
Fixed (0.7.1) the app is now properly sandboxed and only requests Pictures and Documents.
Sorry about that I hadn't paid attention to it. The app wasn't declaring its Sailjail permissions, so the system showed the full unconfined set.
Thanks for the feedback!
nicosouv
Wed, 2026/07/08 - 13:14
Permalink
Oops yeah my bad, I'll change that !