---
title: "ImmichFrame vs Immich Kiosk: which photo frame fits your setup?"
description: "ImmichFrame and Immich Kiosk both turn your Immich library into a digital photo frame. Under the hood they make very different choices. Here is how they compare on architecture, clients, configuration, and security."
url: "https://pixelunion.eu/blog/immichframe-vs-immich-kiosk/"
date: "2026-10-03"
author: "Marc"
categories: ["Community"]
tags: ["Immich","ImmichFrame","Immich Kiosk","Open Source","Self-hosting"]
---


Last year we wrote about [Immich Kiosk](/blog/immich-kiosk/) and [ImmichFrame](/blog/immichframe/). Both projects have shipped a lot of releases since. The question we get from users has changed with them. It used to be "can I do this?" Now it is "which one should I pick?"

On the surface, they do the same thing. Both connect to your Immich server with an API key and show your photos full screen on a display somewhere in your home. Both are community projects, not affiliated with Immich. Both work with a PixelUnion account the same way they work with a self-hosted server: point them at `https://<username>.pixelunion.eu` and give them an API key.

The feature lists overlap almost completely, so I will mostly ignore them. What separates these two is architecture. This post covers the current versions: [ImmichFrame v1.0.38](https://github.com/immichFrame/ImmichFrame/releases) (September 14, 2026) and [Immich Kiosk v0.44.1](https://github.com/damongolding/immich-kiosk/releases) (September 25, 2026).

## Two different ideas of what a photo frame is

### Immich Kiosk: one server, configured by URL

Immich Kiosk, built by Damon Golding, is a single Go binary. It uses Echo for HTTP and templ for server-side templates, and serves a web page on port 3000. That is the whole product. The display is any browser: a Raspberry Pi running Chromium in kiosk mode, an old tablet with Fully Kiosk Browser, a smart TV, a Google Cast target.

The design choice that matters: almost every setting in `config.yaml` can be overridden with a URL query parameter. One Kiosk container can drive every screen in your house, each with its own behavior:

```
http://kiosk.local:3000/?album=ALBUM_ID&layout=splitview&transition=cross-fade
http://kiosk.local:3000/?person=PERSON_ID&show_time=true&image_fit=cover
```

The kitchen tablet shows the family album with a clock. The hallway screen shows one person's photos in portrait mode. Same server, same config file, different URLs. The flip side is that anyone on your network who can reach the page can change what it shows. If that bothers you, `disable_url_queries` turns it off.

### ImmichFrame: a server plus native apps

ImmichFrame goes the other way. The server is C# on ASP.NET Core with a SvelteKit frontend, shipped as `ghcr.io/immichframe/immichframe` on port 8080. On top of that, the project maintains native clients:

- **Android**, via the Play Store or a sideloaded APK, including an Android TV screensaver service
- **Apple TV**, **iPhone and iPad** (iOS 17+), and Apple Silicon Macs via the App Store
- **Desktop** apps for Windows, macOS, and Linux
- **Frameo** frames, the cheap Android-based ones you find for around $40, sideloaded over ADB (Android Debug Bridge)

The native apps are why ImmichFrame looks the way it does. Apple does not allow WebViews (embedded browser components) on tvOS, so the Apple TV app reimplements the display with native controls. On Android TV, ImmichFrame can replace the system screensaver, which a browser tab cannot do. The Android app also runs a small HTTP server on port 53287 that accepts `next`, `previous`, `pause`, `dim`, `undim`, and `brightness?value=0.5`. That last one is what you wire into Home Assistant to dim the frame when the lights go off.

The tradeoff is configuration. It lives at the instance level. As far as I can tell from the docs, there is no equivalent of Kiosk's per-URL overrides, so two screens with different albums usually means two containers or two accounts. Cheap to run. More to maintain.

## The details that matter to power users

### Configuration and state

Kiosk is config-as-code. A YAML file with a published JSON schema for editor autocomplete, environment variables for secrets, and `watch_config` to reload on change. It sits in a Git repo next to the rest of your compose files.

ImmichFrame recently moved the other way. It now ships an admin UI at `/admin` where every setting, including Immich accounts, is editable in the browser and applied live. Settings are stored in a SQLite database (`immichframe.db`) in `/app/Config`. A `Settings.yml` is imported once, on first start. After that, the database is the source of truth and edits to the file are ignored.

That last point will catch people. If you manage your homelab declaratively, ImmichFrame's config is now state you have to back up, not a file you can diff. If you would rather click than edit YAML, it is an improvement. Neither approach is wrong. They are built for different people.

### Content selection

Both cover the basics: albums, excluded albums, people, tags, ratings, memories, favorites, date ranges, and video (still experimental in ImmichFrame). The differences are at the edges.

ImmichFrame is built around **multiple accounts**. Each entry under `Accounts` has its own server URL, API key, and filters. Mix your library with your partner's, or pull from two separate Immich servers, and the frame blends them into one slideshow.

Kiosk goes deeper on filtering within a library. `require_all_people` only shows photos where everyone you listed appears together, which is what you want for a "grandparents with grandkids" frame. There is `excluded_people`, `excluded_partners`, `filter_exclude_faces` for a landscapes-only screen, and `filter_newest` to limit a source to its most recent assets. With `asset_weighting` enabled, a small album does not get drowned out by a large one when you combine sources. Kiosk also supports multiple users through `immich_users_api_keys`, selected per screen by URL.

### Display and hardware

Both offer split-view layouts for two portrait photos on a landscape screen, blurred backgrounds, Ken Burns style zoom and pan, a clock, and OpenWeatherMap weather. ImmichFrame adds calendar overlays from any ICS (iCalendar) feed via `Webcalendars`, which makes it a decent kitchen dashboard.

Kiosk has more options for always-on hardware. `burn_in_interval` periodically dips the UI opacity to protect OLED panels from burn-in. `sleep_start` and `sleep_end` blank the screen at night. `offline_mode` caches a set of assets locally, so a frame on flaky Wi-Fi keeps working. `optimize_images` resizes on the server, so a Pi Zero is not decoding a 48 MP file every 60 seconds.

On Frameo hardware, keep expectations low. These devices run Android 6. Unless you update the system WebView, which the ImmichFrame docs describe and which involves remounting `/system` as root, you lose split view, HEIC (the iPhone photo format) support, and video. It works. It is a good way to give a $40 frame a second life. It is also a tinkering project, not a gift you set up in ten minutes.

### Security

A photo frame sits on your network all day holding a key to your entire photo library. Most people configure it once and never look at it again. That combination deserves a few minutes of thought.

- **Use a dedicated API key per frame.** Immich lets you create API keys with limited permissions. Give the frame only what it needs, and revoke the key if the device is lost or replaced. ImmichFrame also supports `ApiKeyFile`, so the key can come from a Docker secret instead of a config file.
- **Watch for write access.** Kiosk's "more info" overlay has like and hide buttons that favorite, tag, or archive assets in Immich. Useful, but it means the key needs write permissions. If you do not use those buttons, disable them and keep the key read-only.
- **Lock down the frame itself.** Neither server belongs on the open internet. Kiosk has a `password` option and `disable_url_queries`. ImmichFrame has an `AuthenticationSecret` for clients and a separate admin password for `/admin`. The ImmichFrame docs state that the admin UI shows API keys and transmits them in plain text, so put it behind HTTPS if it is reachable from outside your local network.
- **Know what leaves your network.** With PixelUnion, your photos travel from our servers in Europe to the container in your home and then to your screen. Nothing goes through a third-party cloud. The exception is weather: both projects send your coordinates to the OpenWeatherMap API. A small leak, but a real one.

Licensing differs too. Kiosk is AGPL-3.0, ImmichFrame is GPL-3.0. For personal use, that changes nothing. The AGPL also covers software offered over a network, so if you plan to run either as a hosted service for others, read the licenses first.

## So which one should you run?

Pick **Immich Kiosk** if your displays are browsers (Raspberry Pis, wall tablets, smart TVs) and you want one container to drive all of them. It suits people who keep their homelab in YAML and Git, who want fine-grained filters, and who care about burn-in, sleep schedules, and offline caching on always-on hardware.

Pick **ImmichFrame** if you want native apps, especially Apple TV, an Android TV screensaver, or a repurposed Frameo frame. It suits households that want to blend several Immich accounts into one slideshow, or that would rather manage settings in a web UI than in a text file.

Plenty of people run both. Kiosk sits around 1.7k GitHub stars, ImmichFrame around 2.4k, and both ship releases every couple of weeks with active Discord channels on the Immich server. Two maintainers solving the same problem in different ways tends to make both projects better. That is how open source is supposed to work, and it does not happen as often as people assume.

Neither one will tell you anything about your photos you do not already know. What they do is get those photos off a server and onto a wall, where you actually look at them. That is worth an afternoon of tinkering.

If you would rather spend that afternoon on the frame than on running Immich itself, that is what we do. We keep the server updated and backed up on European infrastructure. You get an API key to point your frame at.

[Start free with PixelUnion →](https://pixelunion.eu)

