As a birthday-present for my wife I wanted to gift her an digital picture-frame showing favourites from our Immich gallery. I had some unused old Fire HD 10 tablets laying around, so I wanted to use those.

Required

3D Printing

Passepartout

3D Printed Passepartout

3D Printed Passepartout

OnShape File

Stand

3D Printed Stand

3D Printed Stand

OnShape File

Picture Frame

Installation

Hot Glueing the Passepartout into the Frame

Hot Glueing the Passepartout into the Frame

Hot Glueing the Passepartout into the Frame

Result after glueing and printed picture frame stand

Final result and picture frame stand

Final result and picture frame stand

Immich-Kiosk

Installation on NixOS

In NixOS its very easy to the docker container:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
virtualisation.oci-containers.containers.immich-kiosk = {
  image = "ghcr.io/damongolding/immich-kiosk:latest";
  extraOptions = [
    "--network=immich"
  ];
  ports = [
    "3004:3000"
  ];
  environment = {
    LANG = "en_GB";
    TZ = "Europe/Berlin";
  };
  volumes = [
    "/mnt/rpool/data/immich-kiosk:/config"
  ];
};

Configuration

My Immich-Kiosk Config (/mnt/rpool/data/immich-kiosk/config.yaml)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
immich_api_key: <redacted>
immich_url: <redacted>

show_time: true
time_format: 24 # 12 or 24
show_date: true
date_format: YYYY-MM-DD
clock_source: client

## Kiosk behaviour
duration: 60 # in seconds
disable_screensaver: true # Ask browser to request a lock that prevents device screens from dimming or locking.
optimize_images: true # Whether Kiosk should resize images to match your browser screen dimensions for better performance.
use_gpu: true # Enable GPU acceleration for improved performance.

## Asset sources
show_archived: false # Allow assets marked as archived to be displayed.

albums:
  - favourites
# display album videos
album_video: false
# Album IDs to exclude from being shown. Albums in this list will be filtered from
# appearing in the frame even if they are included in the 'album' list.
album_order: random # random | newest | oldest

## UI
disable_ui: false # this is just a shortcut for all ui elements (show_time, show_date, show_image_time, show_image_date)
frameless: false # remove border around image and rounded corners.
hide_cursor: false # Hide cursor/mouse via CSS.
font_size: 100 # the base font size as a percentage. OMIT the % character
background_blur: true # display a blurred version of image as background
background_blur_amount: 10 # amount of blur to apply to background image (sigma)
theme: fade # which theme to use. fade or solid
layout: splitview # which layout to use. single | splitview | splitview-landscape | portrait | landscape

## Sleep mode
sleep_start: 22 # sleep mode start time
sleep_end: 7 # sleep mode end time
sleep_dim_screen: true # dim screen when sleep mode is active (only works with Fully Kiosk Browser)
sleep_icon: true

## Transition options
transition: cross-fade # cross-fade, fade or none
fade_transition_duration: 1 # in seconds
cross_fade_transition_duration: 1 # in seconds

## Image display settings
show_progress_bar: true # display a progress bar
image_fit: contain # none | contain | cover
image_effect: none # none | zoom | smart-zoom
image_effect_amount: 120
use_original_image: false # use the original file.

## Image METADATA
show_owner: false # show the owner of the image
show_album_name: true
show_person_name: true
show_person_age: true
show_image_time: true
image_time_format: 24 # 12 or 24
show_image_date: true
image_date_format: YYYY-MM-DD
show_image_description: false
show_image_exif: false
show_image_location: true
show_image_qr: false
# hide_countries:
#   - "country to hide"
show_image_id: false
show_more_info: true
show_more_info_image_link: true
show_more_info_qr_code: true

like_button_action: favorite # album, favorite or both [album, favorite]
hide_button_action: tag # tag, archive, or both [tag, archive]

immich_users_api_keys:
    abc: <redacted>
show_user: true # show user name

kiosk:
  port: 3000
  behind_proxy: false
  watch_config: false
  fetched_assets_size: 1000
  http_timeout: 20
  password: ""
  cache: true # cache select api calls
  prefetch: true # fetch assets in the background
  asset_weighting: true # use weighting when picking assets

Final Result

After installing Fully-Kiosk on the tablet and configuring it, the final result looks like this:

Final result #1

Final result #1

Final result #2

Final result #2