eikon

app.eikon.gallery
by LWB lwb89@cosanostr.com

A local-first, privacy-first photo and video gallery for Android, built natively with Kotlin and Jetpack Compose and inspired by the interaction model of Apple Photos.

First release: Sep 26, 2026, 3 total releases.

Most recent release: Sep 28, 2026.

Repo

Appears in 1 app stack.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Sep 28, 2026 1.2.1
    ## 1.2.1 — 2026-09-28 - **Video editing**: trim, and the same adjustments, filters, crop, rotate, flip and straighten a photo has, drawn live by Media3's GPU effects rather than the photo's CPU renderer (perspective, sharpening and the vignette are not offered for video yet, because nothing here draws them for one — see docs/EDITING.md). "Save a copy" renders a new MP4 with Media3's `Transformer`. **Not run on a device, and not tried against a real video file**; the rotation direction and the crop effect's exact numbers are this project's own best reading of Media3's public API. - **The first pinch on a photo** could still stall for a moment because the large version only started preparing after the photo had been on screen a while, and a pinch usually starts well before that. A second finger touching down now starts preparing it immediately, which is a much earlier and more direct signal than the timer alone. - **Checked eikon's own dependency tree for anything Google-proprietary or otherwise closed.** There is none: every dependency, direct and transitive, is open source (mostly Apache License 2.0). A few have "google" in their Maven group id (Dagger, Guava, Accompanist, JSR-305) without being Play Services, Firebase or anything closed — see NOTICE.md, which now lists them explicitly. - **Looked for APK fat to trim.** Over 90% of it is the ONNX models and their runtime, already int8-quantised, uncompressed and memory-mapped rather than copied to storage — genuinely as small as they get without a real quality or speed cost (see docs/PERFORMANCE.md for what was measured and why compressing them would do the opposite of shrinking the app). Removed about 90 KB of duplicate AndroidX license files that NOTICE.md already credits; nothing else was worth the risk for what it would save.
  • Sep 27, 2026 1.2.0
    ## 1.2.0 — 2026-09-27 One APK instead of two, first-run screens, 27 languages, and a round of fixes to the grid, the viewer, People and Search. eikon is still local-first: no account, no analytics, no Google services, and it does not talk to the network unless you allow it, for the backup to a server of your own. ### One APK, and a switch for the network - The `standard` and `backup` builds are **merged into one APK** (`eikon-1.2.0-arm64-v8a.apk`). It holds the `INTERNET` permission, but **"Allow eikon to use the internet" is off by default** and every place that could connect checks it; the first-run screens and Settings both offer it. - **What this changes, honestly:** 1.0.0's `standard` APK made connecting impossible at the operating-system level, because it had no permission. That guarantee is now the app's own switch plus a build check (the build fails if the manifest allows unencrypted traffic or asks for any permission that is not on a reviewed list). It can be read and verified, but the operating system no longer enforces it. If you need the stricter guarantee, keep 1.0.0's `standard` APK. - No Google Play services, Firebase or ML Kit is in the app (checked in the dependency tree and the APK); the emoji-font initializer that would ask Google's font provider is removed. - **This release is signed with a new key** (the original was lost). **It does not install over 1.0.0**: Android refuses an update signed with a different key, so updating means uninstalling 1.0.0 first, which loses its local library index, albums, edits, hidden list and backup settings (your photos and videos do not move and are not touched). From this release on, updates install in place again as long as this key is kept.
    More…
    ### First run and other apps - **First-run screens**: what eikon is, what each permission is for (photos, optional photo locations, optional internet) with Allow buttons, and the promise that nothing depends on anything outside your phone. - **Open from the camera**: a photo just taken opens in eikon's viewer, inside your library, at its place (the camera's review action and "open with"); one that is not in the library yet is shown on its own with a button to open it in the library. ### Languages and look - **27 languages**: English plus the other 23 official languages of the European Union, Simplified Chinese, Russian and Japanese, by the phone's language or per app in the system settings. **The translations were written by an AI model and have not been reviewed by native speakers**: expect stiff phrasing, and corrections are welcome ([docs/TRANSLATING.md](docs/TRANSLATING.md)). Search still understands English and Italian only. - A **squircle launcher icon** (whether the phone shows a squircle or its own shape depends on the launcher), a clearer **Analyze now** button, a visible **Original** toggle in the editor, and a small **Support** section at the bottom of Settings with a Lightning address if you wish to send a few sats. ### Fixes - **Grid zoom**: pinching follows your fingers continuously and settles on the nearest column count, instead of jumping. - **The first zoom of a photo** no longer stops the picture for a moment: the large version is prepared once you have looked at the photo for a moment. - **Closing a photo** no longer flashes the photo you just closed over the grid. - **Videos zoom** (pinch, double tap, drag) and **the seek bar shows the picture as you drag it**, instead of freezing until you let go. - **People**: two groups given the same name become one, and groups that already shared a name are joined when People opens. (A person hidden by you joins nobody.) - **Search**: results no longer redo themselves after every photo the analysis finishes, but when you are not scrolling; searching while the analysis runs no longer reads all image data from the database again; and the words that link a query ("cane sulla neve", "foto all'aperto", "le mie foto del gatto nel giardino") are ignored properly. Other lists no longer redo themselves for the analysis at all, and the *Edited* filter now follows edits. - **Grid thumbnails are now hardware bitmaps**, off the regular memory and without a copy on their first draw, on the reasoning that this is what a big library flung past quickly is most sensitive to; a measured before/after on a phone is still needed to say by how much. - **Motion Photos** (Pixel's and Samsung's few-seconds-of-video-inside-a-JPEG) are now recognised at sync time (`MotionPhotoDetector`, both known formats), marked with a small badge in the grid, and their clip plays once, muted, in the viewer, with a button to play it again; an edited photo shows its edit, not the raw clip. Detection opens and reads a little of every JPEG during sync, which is a cost paid once for everyone, whether or not they have any. ### What has and has not been checked - 859 automated tests, including new ones for the network switch at every place that connects, the pinch maths, the translations (every string, plural form and placeholder in every language), the camera hand-over, the viewer's landing, video scrubbing, the same-name merge, which lists read what the analysis writes, and the Motion Photo offset maths (both the finder and the migration that adds the column for it). Lint is clean. - **Not run on a device yet**: the first-run screens, the grid pinch, the icon, the camera hand-over, the translations on screen, and every fix above. The diagnoses of the first-zoom stall and of the search scrolling stall are likely causes, **not profiled ones**: treat them as attempts until you have tried them. The hardware-bitmap change follows well-known Android guidance for large scrolling image grids but is likewise unmeasured here. **Motion Photo detection was written from the two schemas' public specifications, without a real sample file to test against**, and playback (a custom Media3 data source that skips the JPEG bytes) has not been tried on a device either. Search results are still listed by date, not by how well they match.
  • Sep 26, 2026 1.1.0
    First release. eikon is a local-first, privacy-first photo and video gallery for Android (11 and newer), built natively with Kotlin and Jetpack Compose, inspired by the interaction model of Apple Photos. It reads your photos where Android already keeps them (MediaStore), never copies them (unless you set up the optional backup to a server of your own), has no account and no analytics, and in its standard build has **no internet permission at all**. ### Two builds, one app | File | What it is | | --- | --- | | `eikon-1.0.0-arm64-v8a.apk` | **Standard.** No `INTERNET` permission (the build fails if it ever appears) and no network code. | | `eikon-1.0.0-backup-arm64-v8a.apk` | The same app plus the **backup to your own server** (Immich, Nextcloud / WebDAV). It is the only one with the network permission, used for that backup and nothing else. |
    More…
    Both have the same application id and are signed with the same key, so one installs over the other and keeps your library, albums and edits. Each is about 310 MB, mostly the on-device machine-learning models. arm64-v8a phones only (nearly every phone since 2017). Certificate SHA-256: `97:B2:F7:23:0B:82:4C:C9:85:A0:5F:F3:EE:DD:A9:4E:8B:62:40:14:09:6F:61:01:B3:6C:27:9C:77:64:2F:EF` ### Library - Chronological library that opens instantly and scales to very large collections: served from a local index in pages, never loaded whole into memory. - Date headers per day or month, a fast scroller with a month/year bubble, pinch to change grid density (2 to 7 columns), sorting by date taken or date added. - Combinable filters: photos or videos, favorites only, edited only, and one kind (screenshots, screen recordings, panoramas, RAW). - Multi-select by tap or long-press-and-drag, then share, favorite, add to album, hide or delete (deleting and favoriting go through Android's own confirmation dialogs). - Opening a photo grows it from its thumbnail; closing it shrinks it back into place. "Open with" from other apps shows a picture without adding it to the library. ### Viewer and details - Full-screen viewer: swipe between items, pinch and double-tap zoom, immersive mode, drag down to close, drag up for details. Video playback with seek and mute. - Info panel with the real metadata of the file: resolution, size, dates, camera, lens, exposure, color profile, location (on request, with a small **offline map**), and for videos duration, frame rate, codecs and bitrate. If the photo has been analysed it also says, in a few words, what it shows and any pet in it. - **Captions** you write for a photo (searchable, kept only in eikon's database, never written into the file). - **Change the date or the location** written inside a JPEG, PNG or WebP file, with a safety net: the system asks first, eikon works on a copy, checks the result byte for byte, restores the original if anything fails, and offers undo. ### Collections - Automatic collections (Favorites, Recently added, Videos, Screenshots, Screen recordings, Panoramas, RAW), device folders and your own albums. Albums are virtual: files are never moved or copied. - **Hidden** photos stay out of the Library, Collections, search, places, people, trips, memories and duplicates, behind fingerprint, face or screen lock. **Recently deleted** is the system trash with days remaining, restore and delete-for-good (optionally locked too). ### Search - One search box that understands dates in Italian and English ("agosto 2025", "estate 2025", "14 agosto", "yesterday", "last month"), photos or videos, file names, places ("foto a Roma"), people you named ("foto di Giulia"), captions and text found inside photos (a receipt, a document, a screenshot). It shows how it read what you typed. - **By what photos show**: "cane", "tramonto", "a red car", "una foto sulla neve", in Italian or English, matched by an on-device image model (CLIP). It combines with everything else: "cane sulla neve 2024". - Places are resolved **offline** from a bundled copy of GeoNames data. Text in photos is read on the phone by Tesseract, in English and Italian. - Place, text, content and people search need a background analysis of your library. **It is off by default**: you switch on each step in Settings, choose whether it may run only while charging, and can pause it. It works in short slices, resumes after interruptions, waits in Battery Saver, backs off when the phone gets warm, and analyses the photos on screen first. ### Smart collections - **Places**: photos by country, region and city, and a **map** drawn offline from bundled country outlines: no map service, no tiles, no position ever sent. - **Trips**: stretches of days spent far from where most of your photos are taken, found by rules you can read (100 km, two days or a busy day, at least 10 photos), each showing why it counts. - **Memories**: "On this day", "A year ago", trips and weekends away, a season, a named person in a year, as a slideshow. Hide a memory, ask for fewer like it or for less of a person, or leave out a date. - **Duplicates and similar shots**: identical files and copies of the same picture, and shots of one moment that look alike. eikon only finds them; you choose, and photos go to Recently deleted through Android's own confirmation. - **People**: faces are found and grouped on the phone; nothing is identified and nothing is compared with anything outside your library. Name, rename, favorite, hide, merge two groups, split photos out of a group. **Pets**: Dogs and Cats collections. ### Editing - **Non-destructive**: an edit is a small recipe kept in eikon's database and drawn over the photo; the file is never changed and there is no "replace the original". - Auto enhance, exposure, brightness, contrast, highlights, shadows, black point, saturation, vibrance, temperature, tint, sharpness, vignette, crop (free, 1:1, 4:3, 3:2, 16:9), rotate, flip, straighten, perspective, and eight filters with a strength. - Edited photos look edited in the grid and the viewer, where a chip shows the original. **Save a copy** writes a new JPEG next to the original. **Copy edits** and **Paste edits** apply one photo's look to many at once. Sharing an edited photo shares the edit, without metadata. ### Backup to a server of your own (backup build only) - Copies photos and videos to **Immich** (what Umbrel installs for Android) or **Nextcloud / any WebDAV server**, over TLS only, on the network you allow, only after you turn it on and confirm. - Never deletes or overwrites anything, on the server or the phone; files the server already has are recognised, not sent again. Hidden photos are left out unless you say otherwise. A certificate from an authority your phone does not know can be pinned after you compare its fingerprint. ### Privacy and security - Standard build without `INTERNET`, enforced by the operating system and checked by the build. No account, no analytics, no crash reporting. Android backups of the app's data are disabled. - **The library's database is encrypted** (SQLCipher, AES-256) with a key held by the Android Keystore. A database from an earlier version is converted safely: copied, checked, and only then wiped. - The backup's password or API key, and its server address, login and pinned certificate, are sealed under the Keystore too. - Hidden and Recently deleted mark the window secure (no screenshots, blank recent-apps card) while open; a setting does the same for the whole app. Shared pictures live an hour. Logs carry no content. - Every analysis step (places, text, what photos show, people, duplicates) is off until you turn it on. - Light, dark or system theme; English and Italian; TalkBack labels; an in-app screen with the open-source licenses. ### What has and has not been checked - The gallery foundation and albums (the first two development phases) were used on a real phone. - Everything else is covered by 705 automated tests (764 with the backup build's), several of which run the real machine-learning models and compare them with reference tools, and the SQL is run against a real SQLite. Lint is clean and both builds compile in release mode. - **Not run on a device yet**: the newer screens, the background analysis on a real library (its speed, battery and heat are unmeasured), editing performance, the metadata writer on real files, the SQLCipher database with a real library, the backup against a real Immich or Nextcloud server. Treat 1.0.0 as feature-complete but not field-tested; keep your usual backups. ### Known limits No restore from the backup, and edits, albums and the hidden list are not part of it; no "selfies" filter (Android exposes no reliable signal); videos are not analysed or edited; animated GIF and WebP show their first frame; no music in memories; a file that takes longer than one 8-minute background run to upload is not resumed. Details: [docs/ROADMAP.md](https://github.com/Lwb89dev/eikon-gallery/blob/v1.0.0/docs/ROADMAP.md) and [docs/PRIVACY.md](https://github.com/Lwb89dev/eikon-gallery/blob/v1.0.0/docs/PRIVACY.md).