All apps · 0 apps
folderframe
Docker app from The-Grog's Repository
Overview
Readme
View on GitHubInstall FolderFrame on Unraid
FolderFrame is available in Unraid Community Apps and uses the tested stable image channel.
The optional video fallback tries native playback first, then streams unsupported
video through FFmpeg without creating converted files in your media or appdata.
Software CPU encoding is supported; GPU acceleration is not implemented. It is
limited to two jobs by default and supports sequential playback without arbitrary
seeking. In Add another Path, Port, Variable, Label or Device, choose Variable
to set FOLDERFRAME_VIDEO_TRANSCODE=false, FOLDERFRAME_TRANSCODE_JOBS=1, or
FOLDERFRAME_TRANSCODE_THREADS=2 as needed. See transcoding details.
Install from Community Apps
- Open the Apps tab and search for FolderFrame.
- Select FolderFrame.
- Choose an existing dedicated Media Folder containing only media intended for this gallery. The template mounts it at
/media/Libraryread-only. - Keep the default Appdata Configuration path or choose another persistent directory.
- Choose an unused Web Port.
- Keep Generate Thumbnails and Persistent Media Manifest set to
truefor faster large galleries. - Optionally set any other FolderFrame defaults. Leave an override blank to use
folderframe.config.json. - Click Apply, then open the FolderFrame WebUI.
The media library is mounted at /media/Library read-only. The /media parent stays unmounted so Docker can create additional sibling mounts. Configuration, generated thumbnails, and the persistent manifest are stored separately under /config.
Additional media folders
FolderFrame can combine multiple host directories into one gallery. Each added directory appears as a top-level album and is included in the same thumbnail and manifest scan.
- Open the Unraid Docker tab, click the FolderFrame icon, and choose Edit.
- Click Add another Path, Port, Variable, Label or Device.
- Set Config Type to Path and give it a descriptive name, such as
Archive Photos. - Select the additional host directory in Host Path. For an SMB share,
mount it on Unraid first and select its Linux path, commonly below
/mnt/remotes/; Windows UNC paths cannot be used directly by the container. - Set Container Path to a unique sibling below
/media/, such as/media/Archive. Do not use/mediaitself or reuse another mapping's path. - Set Access Mode to Read Only.
- Click Add, then Apply to recreate the container with the new mount.
Repeat these steps for as many folders as needed, using a different container
path each time—for example /media/Family, /media/Archive, and
/media/Scans. Folder names beneath /media/ become the album names shown in
FolderFrame. The existing photos/ source and generated thumbnail/manifest
configuration do not need to change.
Migrate an existing /media mount
Older FolderFrame containers mounted the primary host directory directly at
/media. That layout cannot support a second read-only library because Docker
cannot create /media/AnotherLibrary beneath a read-only bind mount.
- Stop the container, then open Edit in the Unraid Docker tab.
- Change the existing Media Folder container path from
/mediato/media/Library. Keep its host path and Read Only access mode unchanged. - Add any additional libraries at distinct sibling paths such as
/media/Archiveor/media/Scans; never mount/mediaitself. - Apply the change and open FolderFrame. The primary library now appears as the top-level Library album.
- The manifest and thumbnail worker rebuild paths automatically. To reclaim
no-longer-referenced generated previews after confirming the new gallery,
stop the container and delete only
/config/thumbnails/and/config/folderframe-data/; do not delete original media. Start the container to generate fresh caches.
Persistent configuration
On first start, the container creates:
/mnt/user/appdata/folderframe/folderframe.config.json
/mnt/user/appdata/folderframe/thumbnails/
/mnt/user/appdata/folderframe/folderframe-data/library.json
/mnt/user/appdata/folderframe/folderframe-data/library.d/
/mnt/user/appdata/folderframe/folderframe-data/exif.d/
Edit that file for the complete FolderFrame configuration. It remains outside the image and survives container updates. The file is served to browsers, so do not put passwords, tokens, private filesystem paths, or other secrets in it.
The Unraid fields below provide optional overrides for common settings:
| Unraid field | Environment variable | JSON setting | Accepted values |
|---|---|---|---|
| Source Label | FOLDERFRAME_SOURCE_LABEL |
sources[0].label |
Any non-empty display label |
| Starting View | FOLDERFRAME_STARTING_VIEW |
defaults.view |
folders, all |
| Default Sort | FOLDERFRAME_DEFAULT_SORT |
defaults.sort |
filename, newest, oldest |
| Slideshow Interval | FOLDERFRAME_SLIDESHOW_INTERVAL |
defaults.interval |
3, 5, 10, 15, 30, 60, 300, 900, 3600 |
| Image Display Mode | FOLDERFRAME_IMAGE_MODE |
defaults.imageMode |
fit, original |
| Start Automatically | FOLDERFRAME_AUTOPLAY |
defaults.autoplay |
true, false |
| Shuffle by Default | FOLDERFRAME_SHUFFLE |
defaults.shuffle |
true, false |
| Gallery Refresh Interval | FOLDERFRAME_GALLERY_REFRESH_INTERVAL |
index.refreshInterval |
Integer seconds from 1 to 86400 |
| Embed Refresh Interval | FOLDERFRAME_EMBED_REFRESH_INTERVAL |
embed.refreshInterval |
Integer seconds from 1 to 86400 |
| Remember Browser Preferences | FOLDERFRAME_REMEMBER_PREFERENCES |
defaults.rememberPreferences |
true, false |
| Generate Thumbnails | FOLDERFRAME_THUMBNAILS |
sources[0].thumbnailPath in the runtime copy |
true, false |
| Persistent Media Manifest | FOLDERFRAME_MANIFEST |
sources[0].manifestPath in the runtime copy |
true, false |
| Thumbnail Scan Interval | FOLDERFRAME_THUMBNAIL_INTERVAL |
Shared background worker | Integer seconds from 60 to 86400 |
Blank override fields defer to the persistent JSON file. Explicit overrides are applied to a generated runtime copy; the persistent JSON file is never rewritten.
Persistent thumbnails and manifest
The CA template enables both by default. They share one scan interval and are independently configurable:
| Thumbnails | Manifest | Worker behavior |
|---|---|---|
true |
true |
Generate previews, then update the manifest in one run. |
true |
false |
Generate previews only. |
false |
true |
Update the manifest with --manifest-only. |
false |
false |
Do not start the background worker. |
The initial scan of a very large or Immich-backed library can take time. The gallery remains available. Later scans reuse unchanged manifest directory records; changes appear on the next scan and stale chunks are cleaned up. HEIC/HEIF support is included, while corrupt files are logged. Originals remain read-only.
Missing or invalid manifests trigger a logged full rebuild. Helper errors are
retried at the next interval and do not stop Caddy. scanCache is separate
and not required.
To force a rebuild, stop the container, delete only
/mnt/user/appdata/folderframe/folderframe-data/library.json and
library.d/, then restart. Deleting all appdata also deletes custom
configuration and thumbnails.
The worker records successful preview source signatures in
/mnt/user/appdata/folderframe/folderframe-data/thumbnail-cache.json. It prunes
only generated orphan .webp previews after a complete media discovery; mount
or stat errors retain uncertain previews. A path with changed size or nanosecond
mtime is regenerated rather than reusing a possibly unrelated preview. The first
scan after upgrading may reconcile unsigned existing previews. Media mounts stay
read-only and originals are never modified.
FolderFrame resolves startup settings in this order: packaged defaults, persistent JSON, explicit container overrides, saved browser preferences, then URL parameters. If a changed default appears to have no effect, set Remember Browser Preferences to false, clear that browser's saved FolderFrame preferences, or test with ?remember=0.
Existing installations
Existing containers created before persistent configuration was added continue to run with packaged defaults. To customize them persistently, edit the container and add:
| Setting | Value |
|---|---|
| Config Type | Path |
| Name | Appdata Configuration |
| Container Path | /config |
| Host Path | /mnt/user/appdata/folderframe |
| Access Mode | Read/Write |
The default JSON file is created after the container starts. Existing containers might not automatically gain newer optional environment fields; add them manually or reinstall from the current Community Apps template if needed.
Local template installation
For development or template testing, copy the XML into Unraid's user-template directory:
mkdir -p /boot/config/plugins/dockerMan/templates-user
cp /path/to/FolderFrame-Deployment/templates/folderframe.xml \
/boot/config/plugins/dockerMan/templates-user/my-folderframe.xml
In the Unraid WebGUI, open Docker > Add Container, select folderframe from the Template list, and review every field before applying.
Verify the installation
After applying the template:
- Open WebUI from the container menu.
- Confirm
/mnt/user/appdata/folderframe/folderframe.config.jsonwas created. - Confirm
/mnt/user/appdata/folderframe/thumbnailsbegins receiving WebP files. - Confirm
/mnt/user/appdata/folderframe/folderframe-data/library.json,library.d/, and (for images with usable EXIF)exif.d/are created. - Confirm nested folders and images appear while generation is still running.
- Change one container override, apply the edit, and verify it changes the startup default.
- Restart the container and confirm the configuration, thumbnails, and media return.
- Edit the container and verify every media mapping shows Read Only, uses
a unique sibling path below
/media/, and that nothing is mounted at/mediaitself.
Updating
The template uses ghcr.io/the-grog/folderframe-deployment:stable. Use Docker > Check for Updates, review the FolderFrame release notes, and update when ready. Unraid recreates the container while preserving the external media and appdata directories.
For rollback, edit the Repository field to a known version tag such as ghcr.io/the-grog/folderframe-deployment:v0.6.3, then Apply.
Security
FolderFrame has no built-in authentication or TLS. Anyone who can reach it can browse and download mounted media and read the served configuration. Keep it on a trusted network unless a separate access layer provides authentication and TLS. Never mount an entire share, repository, secrets, private files, or symlinks to private locations.
Manual Refresh
Manual Refresh defaults to true when the persistent manifest is enabled. Clicking Refresh in the gallery requests the same incremental worker used by the schedule, then loads the published result when it completes. Set the field to false to keep scheduled scans but disable browser-triggered scans. Anyone who can reach an unprotected WebUI can request work; use the same proxy authentication for the whole FolderFrame origin.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/the-grog/folderframe-deployment:stableRuntime arguments
- Web UI
http://[IP]:[PORT:8080]/- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Choose an unused host port for the gallery.
- Target
- 8080
- Default
- 8088
- Value
- 8088
Select an existing dedicated gallery folder. It is mounted read-only at /media/Library. To add more, use Add another Path with a different sibling container path, such as /media/Archive. Do not mount anything at /media itself or select a whole share or repository.
- Target
- /media/Library
Persistent FolderFrame configuration. The default JSON file is created automatically on first start.
- Target
- /config
- Default
- /mnt/user/appdata/folderframe
- Value
- /mnt/user/appdata/folderframe
Generate persistent 480px WebP previews in appdata for faster galleries. Originals remain read-only. Set false to disable.
- Target
- FOLDERFRAME_THUMBNAILS
- Default
- true
- Value
- true
Maintain an incremental media index in appdata for faster large-library startup. Independent of thumbnails. Originals remain read-only.
- Target
- FOLDERFRAME_MANIFEST
- Default
- true
- Value
- true
Allow viewers that can access the WebUI to request an immediate incremental scan. Set false to keep scheduled scans only.
- Target
- FOLDERFRAME_MANUAL_REFRESH
- Default
- true
- Value
- true
Seconds between background media scans (60-86400). Used by thumbnails and the persistent manifest; unchanged directories are reused.
- Target
- FOLDERFRAME_THUMBNAIL_INTERVAL
- Default
- 3600
- Value
- 3600
Try native video playback first, then use CPU-based FFmpeg H.264/AAC streaming when the original cannot decode. Valid values: true or false. Originals remain untouched and no converted movies are stored. Set false to avoid transcoding CPU use.
- Target
- FOLDERFRAME_VIDEO_TRANSCODE
- Default
- true
- Value
- true
Maximum simultaneous compatibility streams: integer 1-8. Every active software transcode uses CPU and memory; use 1 on smaller systems or for large 4K media.
- Target
- FOLDERFRAME_TRANSCODE_JOBS
- Default
- 2
- Value
- 2
FFmpeg decoder and encoder threads per compatibility stream: integer 1-16. Higher values may increase throughput but multiply CPU use across active transcodes.
- Target
- FOLDERFRAME_TRANSCODE_THREADS
- Default
- 2
- Value
- 2
Optional label for the mounted media source. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_SOURCE_LABEL
Optional starting view: folders or all. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_STARTING_VIEW
Optional default sort: filename, newest, or oldest. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_DEFAULT_SORT
Optional photo duration in seconds: 3, 5, 10, 15, 30, 60, 300, 900, or 3600. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_SLIDESHOW_INTERVAL
Optional image sizing: fit or original. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_IMAGE_MODE
Optional slideshow startup: true or false. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_AUTOPLAY
Optional shuffle default: true or false. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_SHUFFLE
Optional gallery rescan interval from 1 to 86400 seconds. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_GALLERY_REFRESH_INTERVAL
Optional embed rescan interval from 1 to 86400 seconds. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_EMBED_REFRESH_INTERVAL
Optional preference persistence: true or false. Blank uses folderframe.config.json.
- Target
- FOLDERFRAME_REMEMBER_PREFERENCES