diff --git a/src/modules/fullpageos/start_chroot_script b/src/modules/fullpageos/start_chroot_script
index cb17ef6..37fdc07 100755
--- a/src/modules/fullpageos/start_chroot_script
+++ b/src/modules/fullpageos/start_chroot_script
@@ -108,8 +108,39 @@ then
fi
# Add emoji support
-sudo -u pi mkdir -p /home/pi/.fonts
-sudo -u pi wget --directory-prefix /home/pi/.fonts https://github.com/googlefonts/noto-emoji/raw/main/fonts/NotoColorEmoji.ttf
+apt-get install -y fonts-noto-color-emoji fontconfig
+mkdir -p /etc/fonts/conf.d
+cat > /etc/fonts/conf.d/99-fullpageos-emoji.conf <<'EOF'
+
+
+
+
+
+ sans-serif
+
+
+ Noto Color Emoji
+
+
+
+
+ serif
+
+
+ Noto Color Emoji
+
+
+
+
+ monospace
+
+
+ Noto Color Emoji
+
+
+
+EOF
+fc-cache -f
#override password
if [ "$FULLPAGEOS_OVERRIDE_PASSWORD" != "default" ]
diff --git a/testing/tests/test_emoji.sh b/testing/tests/test_emoji.sh
new file mode 100755
index 0000000..ef6e515
--- /dev/null
+++ b/testing/tests/test_emoji.sh
@@ -0,0 +1,112 @@
+#!/bin/bash
+set -e
+
+export E2E_SSH_HOST="${1:-localhost}"
+export E2E_SSH_PORT="${2:-2222}"
+ARTIFACTS_DIR="${3:-}"
+source /test/scripts/ssh-helpers.sh
+
+TMP_DIR=$(mktemp -d)
+trap 'rm -rf "$TMP_DIR"' EXIT
+
+HTML_FILE="$TMP_DIR/emoji-cloud.html"
+SCREENSHOT_FILE="$TMP_DIR/emoji-cloud.png"
+COUNTS_FILE="$TMP_DIR/emoji-cloud-pixel-counts.txt"
+
+cat > "$HTML_FILE" <<'HTML'
+
+
+
+
+
+
+
+ ☁️
+
+
+HTML
+
+echo "Test: Chromium renders the cloud emoji in color"
+
+echo " Checking Noto Color Emoji font availability..."
+FONT_MATCH=$(ssh_cmd "fc-match 'Noto Color Emoji' || true" 2>/dev/null)
+if ! echo "$FONT_MATCH" | grep -qi "NotoColorEmoji\|Noto Color Emoji"; then
+ echo " FAIL: Noto Color Emoji is not available to fontconfig"
+ echo " fc-match output: $FONT_MATCH"
+ exit 1
+fi
+
+echo " Rendering emoji fixture with Chromium headless..."
+scp_cmd "$HTML_FILE" "pi@${E2E_SSH_HOST}:/tmp/emoji-cloud.html" >/dev/null
+ssh_cmd "rm -rf /tmp/emoji-chromium-profile /tmp/emoji-cloud.png && sudo -u pi env HOME=/home/pi chromium --headless --disable-gpu --no-sandbox --disable-dev-shm-usage --hide-scrollbars --run-all-compositor-stages-before-draw --virtual-time-budget=1000 --user-data-dir=/tmp/emoji-chromium-profile --screenshot=/tmp/emoji-cloud.png --window-size=400,240 file:///tmp/emoji-cloud.html" >/dev/null
+scp_cmd "pi@${E2E_SSH_HOST}:/tmp/emoji-cloud.png" "$SCREENSHOT_FILE" >/dev/null
+
+if [ -n "$ARTIFACTS_DIR" ]; then
+ mkdir -p "$ARTIFACTS_DIR"
+ cp "$HTML_FILE" "$ARTIFACTS_DIR/emoji-cloud.html"
+ cp "$SCREENSHOT_FILE" "$ARTIFACTS_DIR/emoji-cloud.png"
+fi
+
+read -r NON_BACKGROUND_PIXELS CHROMATIC_PIXELS < <(
+ convert "$SCREENSHOT_FILE" -alpha off -depth 8 txt:- | awk -F'[(),]' '
+ NR > 1 {
+ r = $3 + 0
+ g = $4 + 0
+ b = $5 + 0
+
+ dr = r - 16; if (dr < 0) dr = -dr
+ dg = g - 24; if (dg < 0) dg = -dg
+ db = b - 40; if (db < 0) db = -db
+
+ max = r; if (g > max) max = g; if (b > max) max = b
+ min = r; if (g < min) min = g; if (b < min) min = b
+
+ if (dr > 8 || dg > 8 || db > 8) {
+ non_background++
+ if (max - min >= 25) {
+ chromatic++
+ }
+ }
+ }
+ END {
+ print non_background + 0, chromatic + 0
+ }'
+)
+
+echo "non_background_pixels=$NON_BACKGROUND_PIXELS chromatic_pixels=$CHROMATIC_PIXELS" > "$COUNTS_FILE"
+if [ -n "$ARTIFACTS_DIR" ]; then
+ cp "$COUNTS_FILE" "$ARTIFACTS_DIR/emoji-cloud-pixel-counts.txt"
+fi
+
+if [ "$NON_BACKGROUND_PIXELS" -lt 1500 ]; then
+ echo " FAIL: Cloud emoji was not visibly rendered (non-background pixels: $NON_BACKGROUND_PIXELS)"
+ exit 1
+fi
+
+if [ "$CHROMATIC_PIXELS" -lt 50 ]; then
+ echo " FAIL: Cloud emoji rendered without enough color pixels (chromatic pixels: $CHROMATIC_PIXELS)"
+ exit 1
+fi
+
+echo " PASS: Cloud emoji rendered visibly in color"