Hi,
This is Ahmet, CoolCroco’s developer. The app has been in Microsoft Store for a while now and has <500 users.
`coolcroco` is a photo culling viewer for photographers: it reads a folder of RAW
files, holds the decoded frames in RAM so paging through a shoot is instant, and
files each frame into `Approved/` or `Rejected/` as you go.
Revision 1 is uploaded and currently held at
https://dashboard.snapcraft.io/snaps/coolcroco/revisions/1/review/ with:
human review required due to ‘allow-installation’ constraint (bool) declaration-snap-v2_plugs_installation (dot-config-mimeapps, personal-files)
human review required due to ‘allow-installation’ constraint (bool)
declaration-snap-v2_plugs_installation (dot-local-share-mime, personal-files)
human review required due to ‘allow-installation’ constraint (bool)
declaration-snap-v2_plugs_installation (dot-local-share-trash, personal-files)
It is strictly confined and I would like to keep it that way - classic confinement would be the wrong tool
here and I am not asking for it. Four connections do need to be automatic, because
in each case the failure mode is silent: the app looks broken or dishonest rather
than looking unpermitted.
### 1. `removable-media`
Photographers cull straight off the card. The normal first run is: insert an SD card
or plug in an external SSD, point the app at `/media/$USER/…`, and start rejecting
frames. With only `home`, that folder does not exist as far as the app can see - the
folder browser shows nothing and there is no error that could honestly explain why,
because the app cannot distinguish “empty” from “denied”.
This is the interface’s stated purpose and this is the archetypal case for it: a
media application whose input is, most of the time, physically removable media.
(Unlike the three `personal-files` requests below, `removable-media` isn’t holding
revision 1 in review - it doesn’t block installation. This request is only to spare
users the extra step of connecting it by hand.)
### 2. `personal-files: $HOME/.local/share/Trash`
Deleting a photo sends it to the freedesktop trash and the app then keeps a handle
on it so **Ctrl+Z restores it** (`src/recyclebin_linux.py`). Both halves are one
feature - an irreversible delete in a culling tool is a data-loss bug, not a reduced
feature set.
I looked at `org.freedesktop.portal.Trash` first and it does not fit: `TrashFile()`
takes a file descriptor and returns only a result code, so the app never learns where
the file went and cannot offer the undo. Writing the `.trashinfo` sidecar directly is
the only way to keep delete reversible.
Requested paths:
- `$HOME/.local/share/Trash` (write)
### 3. `personal-files: $HOME/.local/share/mime`
Eight RAW formats have no MIME type in any current `shared-mime-info` release -
Hasselblad `.3fr`/`.fff`, Phase One `.iiq`, Epson `.erf`, Mamiya `.mef`, Leaf `.mos`,
Samsung `.srw`, Panasonic `.rwl`. The snap ships a MIME package defining them under
the same names freedesktop uses, so the two merge cleanly once a release catches up.
snapd has no mechanism to install a MIME package system-wide, and the host’s
`shared-mime-info` does not read `$SNAP`. So the app copies the XML into the user’s
own MIME directory on first run and reruns `update-mime-database` there. Without
this, a Hasselblad or Phase One file has no type at all, which means the file
manager cannot offer to open it with anything - not just not with us.
Requested paths:
- `$HOME/.local/share/mime` (write)
### 4. `personal-files: $HOME/.config/*mimeapps.list`
The app has a “Make CoolCroco my default photo viewer” action, which writes the
default-application entries. It is deliberately conservative and already refuses to
touch a type the user has chosen by hand (`_chosen_by_hand()` in `src/assoc_linux.py`);
it claims only types nobody has explicitly assigned.
Three files because the app writes the plain list plus one per `$XDG_CURRENT_DESKTOP`
entry, which on Ubuntu (`ubuntu:GNOME`) is both of the others.
Requested paths:
- `$HOME/.config/mimeapps.list` (write)
- `$HOME/.config/gnome-mimeapps.list` (write)
- `$HOME/.config/ubuntu-mimeapps.list` (write)
### Why `home` does not cover 2–4
All three are hidden directories, which the `home` interface excludes by design. And
the app’s own `$HOME` is redirected into `~/snap/coolcroco`, so writing to
`$XDG_DATA_HOME` from inside the snap lands somewhere the desktop never reads -
these have to be real-home paths or they do nothing at all.
I am the sole publisher and upstream author, and the snap is built from the same
`build_app.py` freeze that produces the AppImage.
Thank you for your consideration ![]()