# Immich Kiosk

<span>Transform your </span>**TV/iPad/Android/Fridge/Browser etc...**<span> into a Slideshow</span>

# Installation Complète sur DietPi

### Raspberry Pi Zero 2 W – Affichage HDMI en Mode Kiosk

*Documentation officielle du setup Immich Kiosk*

---

#### 🧩 Introduction

Ce guide détaille l’installation complète d’un écran Immich Kiosk sur un Raspberry Pi Zero 2 W avec **DietPi**, en utilisant :

- Immich Kiosk (backend)
- Chromium en mode Kiosk (frontend)
- Démarrage automatique plein écran
- Résolution HDMI 1080p
- Masquage du curseur

---

#### 🧩 Préparation de l’image DietPi

Télécharger l’image pour Raspberry Pi Zero 2 W :

👉 **DietPi – Raspberry Pi ARMv8 / ARM64**  
[https://dietpi.com/<span class="ms-0.5 inline-block align-middle leading-none"></span>](https://dietpi.com/)

Flasher la carte SD avec **Balena Etcher** ou **Raspberry PI Imager**.

---

#### 🧩 Configuration avant premier boot

Les fichiers suivants sont à modifier sur la partition **/boot/**.

---

##### ✔ dietpi.txt

```shell
AUTO_SETUP_LOCALE=fr_FR.UTF-8
AUTO_SETUP_KEYBOARD_LAYOUT=fr
AUTO_SETUP_TIMEZONE=Europe/Paris

AUTO_SETUP_NET_ETHERNET_ENABLED=0
AUTO_SETUP_NET_WIFI_ENABLED=1
AUTO_SETUP_NET_WIFI_COUNTRY_CODE=FR

AUTO_SETUP_NET_USESTATIC=0
AUTO_SETUP_BOOT_WAIT_FOR_NETWORK=1

```

---

##### ✔ dietpi-wifi.txt (entrée 0)

```shell
aWIFI_SSID[0]='Thymon 2,4Ghz'
aWIFI_KEY[0]='ReseauThymon13'
aWIFI_KEYMGR[0]='WPA-PSK'

```

---

#### 🧩 Premier démarrage du Raspberry Pi

Le système configure automatiquement :

- langue
- clavier
- WiFi
- SSH

Ensuite, on se connecte via SSH pour poursuivre l’installation.

```bash
ssh root@IP
```

---

#### 🧩 Installation de Chromium en mode Kiosk

Installer Chromium :

```shell
dietpi-software install 113
```

Configurer le mode autostart :

```
dietpi-autostart
```

Choisir :  
`11 : Chromium Kiosk Mode `

Définir l’URL à afficher :  
`<a href="http://127.0.0.1:3000">http:</a><span class="hljs-comment"><a href="http://127.0.0.1:3000">//127.0.0.1:300</a></span>`

---

#### 🧩 Configuration de l’affichage HDMI (1080p)

Modifier la résolution HDMI dans :

```shell
sudo nano /boot/config.txt
```

Ajouter :

<div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs" id="bkmrk--8"></div>```
hdmi_force_hotplug=1
hdmi_group=1
hdmi_mode=16
disable_overscan=1
```

Configurer Chromium pour 1080p :

```shell
sudo nano /boot/dietpi.txt
```

Définir :

```
SOFTWARE_CHROMIUM_RES_X=1920
SOFTWARE_CHROMIUM_RES_Y=1080
```

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--9"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div></div>---

#### 🧩 Ajustement du script Chromium Autostart

Éditer :

```shell
sudo nano /var/lib/dietpi/dietpi-software/installed/chromium-autostart.sh
```

Remplacer par :

```bash
#!/bin/dash

RES_X=$(sed -n '/^[[:blank:]]*SOFTWARE_CHROMIUM_RES_X=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)
RES_Y=$(sed -n '/^[[:blank:]]*SOFTWARE_CHROMIUM_RES_Y=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)

cat > /tmp/xinitrc.tmp << 'EOF'
#!/bin/dash
unclutter -idle 0 -root &
exec "$@"
EOF
chmod +x /tmp/xinitrc.tmp

CHROMIUM_OPTS="--kiosk --no-memcheck --window-size=${RES_X:-1280},${RES_Y:-720} --window-position=0,0"

URL=$(sed -n '/^[[:blank:]]*SOFTWARE_CHROMIUM_AUTOSTART_URL=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)

FP_CHROMIUM=$(command -v chromium-browser)
[ "$FP_CHROMIUM" ] || FP_CHROMIUM=$(command -v chromium)

STARTX='xinit'
[ "$USER" = 'root' ] || STARTX='startx'

exec "$STARTX" /tmp/xinitrc.tmp "$FP_CHROMIUM" $CHROMIUM_OPTS "${URL:-https://dietpi.com/}"

```

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--13"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>---

#### 🧩 Installation d’Immich Kiosk (backend)

Télécharger le binaire ARM64 :

```
wget https://github.com/damongolding/immich-kiosk/releases/latest/download/immich-kiosk_Linux_arm64.tar.gz
```

Extraire :

```shell
tar -xzf immich-kiosk_Linux_arm64.tar.gz
```

Créer le dossier config :

```shell
mkdir -p /root/config 
wget -O /root/config/config.yaml https://raw.githubusercontent.com/damongolding/immich-kiosk/refs/heads/main/config.example.yaml
```

Modifier le fichier config.yaml :

```shell
nano /root/config/config.yaml
```

Exemple :

```yaml
immich_url: "https://MON_IP_IMMICH:2283" 
immich_api_key: "CLE_API_IMMICH"
```

---

#### 🧩 Création du service systemd Immich Kiosk

Créer le fichier :

```shell
sudo nano /etc/systemd/system/immich-kiosk.service
```

Ajouter :

```shell
[Unit]
Description=Immich Kiosk
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=2
User=root
WorkingDirectory=/root
ExecStart=/root/immich-kiosk --config /root/config/config.yaml
Environment=HOME=/root

[Install]
WantedBy=multi-user.target
```

Activer le service :

```shell
sudo systemctl daemon-reload 
sudo systemctl enable immich-kiosk 
sudo systemctl start immich-kiosk
```

---

#### 🧩 Vérifications finales

Immich Kiosk tourne :

```
systemctl status immich-kiosk
```

Port 3000 ouvert :

```
ss -tulnp | grep 3000
```

Test local :

```
curl http://127.0.0.1:3000
```

Reboot final :

```
reboot
```

Après redémarrage, l’écran HDMI affichera **Immich Kiosk plein écran 1080p**, sans curseur.

---

#### 🎉 Fin du guide

Tu disposes maintenant d’un setup stable, automatique et optimisé pour diffuser les photos Immich sur un écran dédié.

# Réglages complets de config.yaml

## Tous les paramètres expliqués  


---

#### 1. Paramètres requis

- `immich_api_key` : « clé API » du serveur Immich.
- `immich_url` : URL de ton serveur Immich, ex : `"http://192.168.1.10:2283"`.

> **Remarque** : seules ces deux valeurs sont absolument obligatoires pour que le Kiosk fonctionne. <span><span class="ms-1 inline-flex max-w-full items-center relative top-[-0.094rem] animate-[show_150ms_ease-in]">[<span class="relative start-0 bottom-0 flex h-full w-full items-center"><span class="flex h-4 w-full items-center justify-between overflow-hidden"><span class="max-w-[15ch] grow truncate overflow-hidden text-center">Immich Kiosk</span></span></span>](https://docs.immichkiosk.app/configuration/?utm_source=chatgpt.com)  
> </span></span>

```
nano /root/config/config.yaml
```

---

#### 2. Horloge / Date

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-valeur-par"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Valeur par défaut</th><th>Description</th></tr></thead><tbody><tr><td>`show_time`</td><td>`false`</td><td>Afficher l’heure à l’écran</td></tr><tr><td>`time_format`</td><td>`24`</td><td>Format 12 ou 24 heures</td></tr><tr><td>`show_date`</td><td>`false`</td><td>Afficher la date</td></tr><tr><td>`date_format`</td><td>`YYYY/MM/DD`</td><td>Format de la date</td></tr><tr><td>`clock_source`</td><td>`client`</td><td>Source de l’heure : client ou autre</td></tr></tbody></table>

</div></div>---

#### 3. Comportement du Kiosk (Kiosk behaviour)

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-valeur-des"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Valeur</th><th>Description</th></tr></thead><tbody><tr><td>`duration`</td><td>`60`</td><td>Temps d’affichage de chaque image (secondes)</td></tr><tr><td>`disable_screensaver`</td><td>`false`</td><td>Empêcher l’écran de s’éteindre ou de se mettre en veille</td></tr><tr><td>`optimize_images`</td><td>`false`</td><td>Redimensionner les images pour correspondre à l’écran pour de meilleures performances</td></tr><tr><td>`use_gpu`</td><td>`true`</td><td>Utiliser l’accélération GPU si disponible</td></tr></tbody></table>

</div></div>---

#### 4. Sources d’actifs / filtres

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-descriptio"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Description</th></tr></thead><tbody><tr><td>`show_archived`</td><td>Autoriser les médias “archivés” à être affichés</td></tr><tr><td>`people`</td><td>Liste d’IDs de personnes à afficher</td></tr><tr><td>`require_all_people`</td><td>Si `true`, n’affiche que les médias qui contiennent **toutes** les personnes listées</td></tr><tr><td>`excluded_people`</td><td>Liste de personnes à **exclure**</td></tr><tr><td>`albums`</td><td>Liste d’IDs d’albums à afficher</td></tr><tr><td>`album_video`</td><td>`false` ou `true` : afficher les vidéos des albums</td></tr><tr><td>`album_order`</td><td>`random`, `newest` ou `oldest` : ordre d’affichage des albums</td></tr><tr><td>`excluded_albums`</td><td>IDs d’albums à exclure</td></tr><tr><td>`dates`</td><td>Plages de dates au format `"YYYY-MM-DD_to_YYYY-MM-DD"`</td></tr><tr><td>`tags`</td><td>Liste de tags à inclure</td></tr><tr><td>`excluded_tags`</td><td>Liste de tags à exclure</td></tr><tr><td>`excluded_partners`</td><td>IDs de partenaires à exclure</td></tr><tr><td>`memories`</td><td>`false` ou `true` : afficher la section “souvenirs”</td></tr></tbody></table>

</div></div>---

#### 5. Interface utilisateur (UI)

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-valeur-par-1"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Valeur par défaut</th><th>Description</th></tr></thead><tbody><tr><td>`disable_ui`</td><td>`false`</td><td>Cacher tous les éléments UI (horloge/date/…)</td></tr><tr><td>`frameless`</td><td>`false`</td><td>Enlever les bordures et coins arrondis autour de l’image</td></tr><tr><td>`frame_padding`</td><td>`0` ou `[top, right, bottom, left]`</td><td>Marges autour de l’image</td></tr><tr><td>`hide_cursor`</td><td>`false`</td><td>Cacher le curseur souris</td></tr><tr><td>`font_size`</td><td>`100`</td><td>Taille de police (en pourcentage)</td></tr><tr><td>`background_blur`</td><td>`true`</td><td>Flouter l’arrière-plan de l’image actuelle</td></tr><tr><td>`background_blur_amount`</td><td>`10`</td><td>Intensité du flou</td></tr><tr><td>`theme`</td><td>`fade` ou `solid`</td><td>Thème visuel</td></tr><tr><td>`layout`</td><td>`single`, `splitview`, `splitview-landscape`, `portrait`, `landscape`</td><td>Disposition de l’affichage</td></tr></tbody></table>

</div></div>---

#### 6. Transition &amp; affichage des images

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-valeur-des-1"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Valeur</th><th>Description</th></tr></thead><tbody><tr><td>`transition`</td><td>`none`, `fade`, `cross-fade`</td><td>Type de transition entre images</td></tr><tr><td>`fade_transition_duration`</td><td>`1` (s)</td><td>Durée pour `fade`</td></tr><tr><td>`cross_fade_transition_duration`</td><td>`1` (s)</td><td>Durée pour `cross-fade`</td></tr><tr><td>`show_progress_bar`</td><td>`false`</td><td>Afficher ou non une barre de progression</td></tr><tr><td>`image_fit`</td><td>`none`, `contain`, `cover`</td><td>Comment l’image remplit l’écran</td></tr><tr><td>`image_effect`</td><td>`none`, `zoom`, `smart-zoom`</td><td>Effet visuel appliqué à l’image</td></tr><tr><td>`image_effect_amount`</td><td>`120`</td><td>Intensité de l’effet</td></tr><tr><td>`use_original_image`</td><td>`false`</td><td>Utiliser l’image originale sans optimisation</td></tr></tbody></table>

</div></div>---

#### 7. Métadonnées des images

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-descriptio-1"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Description</th></tr></thead><tbody><tr><td>`show_owner`</td><td>Afficher le propriétaire de l’image</td></tr><tr><td>`show_album_name`</td><td>Afficher le nom de l’album</td></tr><tr><td>`show_person_name`</td><td>Afficher le nom de la personne identifiée</td></tr><tr><td>`show_person_age`</td><td>Afficher l’âge de la personne</td></tr><tr><td>`show_image_time`</td><td>Afficher l’heure de la prise de vue</td></tr><tr><td>`image_time_format`</td><td>`12` ou `24` heures</td></tr><tr><td>`show_image_date`</td><td>Afficher la date de prise</td></tr><tr><td>`image_date_format`</td><td>Format de date</td></tr><tr><td>`show_image_description`</td><td>Afficher la description de l’image</td></tr><tr><td>`show_image_exif`</td><td>Afficher les données EXIF (focale, ISO, etc.)</td></tr><tr><td>`show_image_location`</td><td>Afficher le lieu de prise</td></tr><tr><td>`hide_countries`</td><td>Liste de pays à exclure de l’affichage</td></tr><tr><td>`show_image_id`</td><td>Afficher l’ID de l’image</td></tr><tr><td>`show_more_info`</td><td>Afficher un overlay “plus d’infos” sur l’image</td></tr><tr><td>`show_more_info_image_link`</td><td>Mettre un lien vers l’image originale</td></tr><tr><td>`show_more_info_qr_code`</td><td>Afficher un QR code vers l’image originale</td></tr><tr><td>`like_button_action`</td><td>Action du bouton “J’aime” : `album`, `favorite`, ou les deux</td></tr><tr><td>`hide_button_action`</td><td>Action du bouton “Masquer” : `tag`, `archive`, ou les deux</td></tr></tbody></table>

</div></div>---

#### 8. Fonction météo (Weather feature)

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-descriptio-2"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Description</th></tr></thead><tbody><tr><td>`weather:`</td><td>Liste d’objets météo :   
• `name`: nom de la ville   
• `lat`, `lon`: coordonnées   
• `api`: clé API OpenWeatherMap   
• `unit`: `metric` ou `imperial`   
• `lang`: langue   
• `forecast`: `false` ou `true`</td></tr></tbody></table>

</div></div>---

#### 9. Iframes / contenu externe

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-descriptio-3"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Description</th></tr></thead><tbody><tr><td>`iframe:`</td><td>Liste d’URLs ou de chemins d’accès local à intégrer   
Ex : `- https://example.com/page` ou `- ./local.html`</td></tr></tbody></table>

</div></div>---

#### 10. Multi-utilisateurs / webhooks / mode hors ligne

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-descriptio-4"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Description</th></tr></thead><tbody><tr><td>`immich_users_api_keys:`</td><td>Map utilisateur → clé API (permet plusieurs utilisateurs)</td></tr><tr><td>`show_user`</td><td>Afficher le nom de l’utilisateur courant</td></tr><tr><td>`offline_mode:`</td><td>Objet : `enabled`, `number_of_assets`, `max_size`, `parallel_downloads`, `expiration_hours`   
Permet d’utiliser le Kiosk hors connexion</td></tr><tr><td>`kiosk:`</td><td>Sous-objet non modifiable via URL :   
• `port` : port d’écoute (ex : 3000)   
• `behind_proxy` : `true</td></tr></tbody></table>

</div></div>---

#### 11. Sleep mode (mode veille)

Le **sleep mode** permet de rendre le cadre photo inactif sur une plage horaire (ex : la nuit). Quand il est actif, l’écran devient noir (et peut afficher une horloge/date très discrète si `show_time` ou `show_date` est activé).

> **Important :** pour activer le mode veille, il faut définir `sleep_start` <u>et</u> `sleep_end`. Le format est en 24h : soit l’heure (`22`, `7`), soit HHmm (`1332`, `1508`). Pour éviter les surprises YAML, tu peux écrire les heures entre guillemets (ex. `"07"`).

<div class="_tableContainer_1rjym_1" id="bkmrk-param%C3%A8tre-valeur-par-2"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Paramètre</th><th>Valeur par défaut</th><th>Description</th></tr></thead><tbody><tr><td>`sleep_start`</td><td>`(non défini)`</td><td>Heure de début du mode veille (24h : `22` ou `1332`).</td></tr><tr><td>`sleep_end`</td><td>`(non défini)`</td><td>Heure de fin du mode veille (24h : `7` ou `1508`).</td></tr><tr><td>`sleep_icon`</td><td>`true`</td><td>Afficher une icône pendant le mode veille.</td></tr><tr><td>`sleep_dim_screen`</td><td>`false`</td><td>Dim l’écran pendant le sleep mode (fonctionne uniquement avec **Fully Kiosk Browser**).</td></tr><tr><td>`disable_sleep`</td><td>`false`</td><td>Permet de bypass le sleep mode (pratique pour tester). Peut aussi se faire via l’URL.</td></tr></tbody></table>

</div></div>##### 🧪 Exemple (veille de 22:00 à 07:00)

```yaml
# Sleep mode
sleep_start: "22"
sleep_end: "07"

# Optionnel
sleep_icon: true
sleep_dim_screen: false
disable_sleep: false

```

##### 🧷 Astuce test rapide (bypass via URL)

```
http://{URL_DU_KIOSK}?disable_sleep=true
```

*Note :* `sleep_dim_screen` nécessite Fully Kiosk Browser (version Pro) et l’option “Enable JavaScript Interface”.

#### 📝 Exemple complet minimal  


```yaml
immich_api_key: "TON_API_KEY"
immich_url: "http://192.168.1.10:2283"

# Horloge
show_time: true
time_format: 24
show_date: true
date_format: YYYY/MM/DD

# Kiosk behaviour
duration: 45
disable_screensaver: true
optimize_images: true
use_gpu: true

# Sources d’actifs
albums:
  - "ALBUM_ID_1"
people:
  - "PERSON_ID_1"
tags:
  - "famille"

# UI / image
layout: single
theme: fade
image_fit: cover
hide_cursor: true
frameless: true

# Métadonnées
show_album_name: true
show_person_name: true
show_image_date: true
image_date_format: DD/MM/YYYY

# Kiosk interne
kiosk:
  port: 3000
  cache: true
  prefetch: true

```

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--11"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>---

### ℹ️ Bonnes pratiques

- Garder le fichier `config.yaml` à jour et sauvegardé.
- Pour tester un réglage, relancer le service :
    
    ```
    systemctl restart immich-kiosk
    ```
- Vérifier toujours la page : `curl http://127.0.0.1:3000` pour s’assurer que le backend répond.