From e894dc97c20d43f1554ed9fdad3f6999845e7980 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Thu, 18 Dec 2025 16:53:21 +0100 Subject: [PATCH 1/6] fix: Removes automatic selection of drive --- preseed.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/preseed.cfg b/preseed.cfg index 4d2ba36..7518b53 100644 --- a/preseed.cfg +++ b/preseed.cfg @@ -32,7 +32,6 @@ d-i user-setup/allow-password-weak boolean true d-i clock-setup/utc boolean true d-i clock-setup/ntp boolean true -d-i partman-auto/disk string /dev/sda d-i partman-auto/method string regular d-i partman-auto/choose_recipe select atomic d-i partman/confirm_write_new_label boolean true From 1974d0b9a94b4fcaa737855a5ebc4b4e2997bd54 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Thu, 18 Dec 2025 18:09:39 +0100 Subject: [PATCH 2/6] chore: Adds cage and firefox-esr packages --- post_install.sh | 8 +++++++- preseed.cfg | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/post_install.sh b/post_install.sh index 4ff2943..b721751 100644 --- a/post_install.sh +++ b/post_install.sh @@ -71,4 +71,10 @@ Environment=DISPLAY=:0 [Install] WantedBy=graphical.target EOF -systemctl enable firefox-kiosk.service \ No newline at end of file +systemctl enable firefox-kiosk.service + +tee /home/kiosk/.bash_profile > /dev/null <<'EOF' +if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then + exec sway +fi +EOF \ No newline at end of file diff --git a/preseed.cfg b/preseed.cfg index 7518b53..b934651 100644 --- a/preseed.cfg +++ b/preseed.cfg @@ -51,6 +51,8 @@ d-i pkgsel/include string \ openbox \ chromium \ sudo \ + cage \ + firefox-esr \ curl d-i pkgsel/exclude string gnome-software From 8538c63c4575b776f6e6f71a32f374b2e5e1387c Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Thu, 18 Dec 2025 18:17:40 +0100 Subject: [PATCH 3/6] chore: Disables firefox service --- post_install.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/post_install.sh b/post_install.sh index b721751..f106c15 100644 --- a/post_install.sh +++ b/post_install.sh @@ -54,24 +54,24 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' } EOF chown -R kiosk:kiosk /home/kiosk/.config -tee /etc/systemd/system/firefox-kiosk.service > /dev/null <<'EOF' -[Unit] -Description=Firefox Kiosk -After=graphical.target -Wants=graphical.target +# tee /etc/systemd/system/firefox-kiosk.service > /dev/null <<'EOF' +# [Unit] +# Description=Firefox Kiosk +# After=graphical.target +# Wants=graphical.target -[Service] -User=kiosk -Type=simple -ExecStart=/usr/bin/firefox --kiosk https://mahn.ke -Restart=always -RestartSec=5 -Environment=DISPLAY=:0 +# [Service] +# User=kiosk +# Type=simple +# ExecStart=/usr/bin/firefox --kiosk https://c3nav.ke +# Restart=always +# RestartSec=5 +# Environment=DISPLAY=:0 -[Install] -WantedBy=graphical.target -EOF -systemctl enable firefox-kiosk.service +# [Install] +# WantedBy=graphical.target +# EOF +# systemctl enable firefox-kiosk.service tee /home/kiosk/.bash_profile > /dev/null <<'EOF' if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then From 502e332180c3fbb4b30ce7a7c2c55c4efcce1796 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Thu, 18 Dec 2025 18:17:54 +0100 Subject: [PATCH 4/6] refactor: Starts firefox inside cage --- post_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/post_install.sh b/post_install.sh index f106c15..44423ba 100644 --- a/post_install.sh +++ b/post_install.sh @@ -75,6 +75,6 @@ chown -R kiosk:kiosk /home/kiosk/.config tee /home/kiosk/.bash_profile > /dev/null <<'EOF' if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then - exec sway + exec cage firefox --kiosk https://c3nav.de fi EOF \ No newline at end of file From 74407287b70030449a9d1e88b9f3c28fd2c7ec07 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Thu, 18 Dec 2025 18:27:32 +0100 Subject: [PATCH 5/6] fix: Removes firefox service --- post_install.sh | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/post_install.sh b/post_install.sh index 44423ba..8c9659e 100644 --- a/post_install.sh +++ b/post_install.sh @@ -54,24 +54,6 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' } EOF chown -R kiosk:kiosk /home/kiosk/.config -# tee /etc/systemd/system/firefox-kiosk.service > /dev/null <<'EOF' -# [Unit] -# Description=Firefox Kiosk -# After=graphical.target -# Wants=graphical.target - -# [Service] -# User=kiosk -# Type=simple -# ExecStart=/usr/bin/firefox --kiosk https://c3nav.ke -# Restart=always -# RestartSec=5 -# Environment=DISPLAY=:0 - -# [Install] -# WantedBy=graphical.target -# EOF -# systemctl enable firefox-kiosk.service tee /home/kiosk/.bash_profile > /dev/null <<'EOF' if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then From 84281c058648cd18ee702d772766cf1a170670e8 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Mon, 22 Dec 2025 07:26:01 +0100 Subject: [PATCH 6/6] feat: Adds tampermonkey scripts --- tampermonkey/backtohome.js | 122 +++++++++++++++++++++ tampermonkey/hvv.js | 214 +++++++++++++++++++++++++++++++++++++ tampermonkey/mastodon.js | 130 ++++++++++++++++++++++ 3 files changed, 466 insertions(+) create mode 100644 tampermonkey/backtohome.js create mode 100644 tampermonkey/hvv.js create mode 100644 tampermonkey/mastodon.js diff --git a/tampermonkey/backtohome.js b/tampermonkey/backtohome.js new file mode 100644 index 0000000..5dbb51e --- /dev/null +++ b/tampermonkey/backtohome.js @@ -0,0 +1,122 @@ +// ==UserScript== +// @name Back to Home (39C3 Kiosk) +// @namespace http://tampermonkey.net/ +// @version 2025-12-18 +// @description Adds buttons to every website to return to home page and prompts on idle +// @author You +// @match *://*/* +// @icon https://www.google.com/s2/favicons?sz=64&domain=google.com +// @grant GM_addStyle +// ==/UserScript== + +(function() { + 'use strict'; + + const btn = document.createElement('button'); + btn.textContent = 'Home'; + btn.style.cssText = ' all: unset; box-sizing: border-box; border: 2px solid #141414; background: #faf5f5; text-align: center; color: #141414; position: fixed; right: 10px; bottom: 10px; width: 60px; height: 60px; z-index: 2147483647; padding-top: 6px; border-radius: 60px;'; + btn.innerHTML = ''; + btn.addEventListener('click', () => { + window.location.href = 'http://127.0.0.1:8080'; + }); + (document.body || document.documentElement).appendChild(btn); + + + const IDLE_LIMIT_MS = 30_000; // 30 seconds + let idleTimer = null; + let promptVisible = false; + + const modal = document.createElement('div'); + modal.id = 'idle-modal'; + modal.hidden = true; + modal.style.cssText = ` + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: #141414 !important; + border-radius: 0.385em; + border: 2px solid #444; + padding: 20px; + z-index: 2147483647; + box-shadow: 0 4px 8px rgba(0,0,0,0.2); + `; + modal.innerHTML = ` +

You seem to be idle

+

Do you want to stay on this page or go back to the home page?

+ + + `; + document.body.appendChild(modal); + + const backdrop = document.createElement('div'); + backdrop.id = 'idle-backdrop'; + backdrop.hidden = true; + backdrop.style.cssText = ` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.5); + z-index: 2147483646; + `; + document.body.appendChild(backdrop); + + const userEvents = [ + 'mousemove', + 'mousedown', + 'keydown', + 'wheel', + 'touchstart', + 'scroll' + ]; + + function showPrompt() { + promptVisible = true; + modal.hidden = false; + backdrop.hidden = false; + debugger; + // Move focus to the primary action for accessibility + document.querySelector("#idle-stay").addEventListener("click", () => { + hidePrompt(); + resetIdleTimer(); + }); + document.querySelector("#idle-go").addEventListener("click", () => { + window.location.href = 'https://www.google.com'; + }); + } + + function hidePrompt() { + promptVisible = false; + modal.hidden = true; + backdrop.hidden = true; + } + + function onIdle() { + showPrompt(); + } + + function resetIdleTimer() { + if (promptVisible) return; // Don't auto-dismiss while prompt is visible + if (idleTimer) clearTimeout(idleTimer); + idleTimer = setTimeout(onIdle, IDLE_LIMIT_MS); + } + + // Any user activity resets the timer + userEvents.forEach(evt => { + document.addEventListener(evt, resetIdleTimer, { passive: true }); + }); + + // When returning to a visible tab, refresh the timer + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + resetIdleTimer(); + } + }); + + // Actions + + // Kick things off + resetIdleTimer(); +})(); diff --git a/tampermonkey/hvv.js b/tampermonkey/hvv.js new file mode 100644 index 0000000..7b59d14 --- /dev/null +++ b/tampermonkey/hvv.js @@ -0,0 +1,214 @@ +// ==UserScript== +// @name HVV Styling (39C3 Kiosk) +// @namespace http://tampermonkey.net/ +// @version 2025-12-18 +// @description try to take over the world! +// @author You +// @match https://www.hvv.de/de/fahrplaene/abruf-fahrplaninfos/abfahrten-auf-ihrem-monitor/abfahrten-anzeige?show=66c992574d6c4179a65009c84f0f74fc +// @icon https://www.google.com/s2/favicons?sz=64&domain=hvv.de +// @grant GM_addStyle +// ==/UserScript== + +(function() { + 'use strict'; + + GM_addStyle(`:root { + --color-neutral-50: #f2f0f5; + --color-neutral-100: #d1c6e0; + --color-neutral-200: #b2a0cb; + --color-neutral-300: #957eb5; + --color-neutral-400: #7a60a0; + --color-neutral-500: #61468b; + --color-neutral-600: #4b3176; + --color-neutral-700: #371f60; + --color-neutral-800: #26114b; + --color-neutral-900: #180736; + --color-neutral-950: #0c011f; + --color-argon-50: #e1abc9; + --color-argon-100: #da87b5; + --color-argon-200: #d464a1; + --color-argon-300: #cd448f; + --color-argon-400: #c6257d; + --color-argon-500: #b0166f; + --color-argon-600: #9a0a61; + --color-argon-700: #830755; + --color-argon-800: #6d0449; + --color-argon-900: #56023c; + --color-argon-950: #3f012d; + --color-krypton-50: #b2d9ea; + --color-krypton-100: #8cc9e4; + --color-krypton-200: #69bade; + --color-krypton-300: #4badd8; + --color-krypton-400: #2493c2; + --color-krypton-500: #167fac; + --color-krypton-600: #0a6c96; + --color-krypton-700: #075c81; + --color-krypton-800: #044c6b; + --color-krypton-900: #023c55; + --color-krypton-950: #012c3f; + --color-green-50: #c0f49a; + --color-green-100: #a7e57a; + --color-green-200: #8fd75d; + --color-green-300: #7ac843; + --color-green-400: #66b92d; + --color-green-500: #54aa18; + --color-green-600: #47990f; + --color-green-700: #397e0a; + --color-green-800: #2b6206; + --color-green-900: #1f4703; + --color-green-950: #122b01; + --color-red-50: #e6afaf; + --color-red-100: #dd9090; + --color-red-200: #d57272; + --color-red-300: #cc5757; + --color-red-400: #c33d3d; + --color-red-500: #bb2626; + --color-red-600: #b21010; + --color-red-700: #950808; + --color-red-800: #780404; + --color-red-900: #5c0202; + --color-red-950: #3f0101; + --color-yellow-50: #fefce8; + --color-yellow-100: #fef9c2; + --color-yellow-200: #fff085; + --color-yellow-300: #ffdf20; + --color-yellow-400: #fdc700; + --color-yellow-500: #efb100; + --color-yellow-600: #d08700; + --color-yellow-700: #a65f00; + --color-yellow-800: #894b00; + --color-yellow-900: #733e0a; + --color-yellow-950: #432004; + + --color-white: #ffffff; + + --color-dark-foreground: var(--color-neutral-50); + --color-dark-background: var(--color-neutral-950); + --color-dark-shade-1: var(--color-neutral-900); + --color-dark-shade-2: var(--color-neutral-800); + --color-dark-shade-3: var(--color-neutral-700); + --color-dark-shade-4: var(--color-neutral-600); + --color-dark-text-1: rgba(250, 245, 245, 0.8); + --color-dark-text-2: var(--color-neutral-300); + --color-dark-text-3: var(--color-neutral-400); + --color-dark-text-4: var(--color-neutral-500); + --color-dark-primary: var(--color-argon-400); + --color-dark-secondary: #9673ff; + --color-dark-error: var(--color-red-500); + --color-dark-success: var(--color-green-500); + --color-dark-warning: var(--color-yellow-500); + --color-dark-accent-1: #60a5f9; + --color-dark-accent-2: #d381f7; + --color-dark-accent-3: #ff7975; + + --color-light-foreground: var(--color-neutral-950); + --color-light-background: var(--color-neutral-50); + --color-light-shade-1: var(--color-neutral-100); + --color-light-shade-2: var(--color-neutral-200); + --color-light-shade-3: var(--color-neutral-300); + --color-light-shade-4: var(--color-neutral-400); + --color-light-text-1: var(--color-neutral-800); + --color-light-text-2: var(--color-neutral-700); + --color-light-text-3: var(--color-neutral-600); + --color-light-text-4: var(--color-neutral-500); + --color-light-primary: var(--color-argon-600); + --color-light-secondary: var(--color-krypton-500); + --color-light-error: var(--color-red-600); + --color-light-success: var(--color-green-600); + --color-light-warning: var(--color-yellow-600); + --color-light-accent-1: #303ec0; + --color-light-accent-2: #6c366c; + --color-light-accent-3: #932f0a; + + --color-cmyk-primary: var(--color-dark-primary); + --color-cmyk-secondary: var(--color-dark-secondary); + + --line-height-loose: 1.4; + --line-height-relaxed: 1.3; + --line-height-base: 1.2; + --line-height-snug: 1.1; + --line-height-tight: 1; + + --text-xs: 0.75rem; + --text-sm: 0.875rem; + --text-base: 1rem; + --text-lg: 1.125rem; + --text-xl: 1.25rem; + --text-2xl: 1.5rem; + --text-3xl: 1.875rem; + --text-4xl: 2.25rem; + --text-5xl: 3rem; + --text-6xl: 3.75rem; + --text-7xl: 4.5rem; + + --container-3xs: 16rem; + --container-2xs: 18rem; + --container-xs: 20rem; + --container-sm: 24rem; + --container-md: 28rem; + --container-lg: 32rem; + --container-xl: 36rem; + --container-2xl: 42rem; + --container-3xl: 48rem; + --container-4xl: 56rem; + --container-5xl: 64rem; + --container-6xl: 72rem; + --container-7xl: 80rem; +} + +#page-content, .f-body { + margin: 0; + padding: 0 +} + +.o-headline1 { + color: rgb(102, 246, 102); + font-size: 3em +} + +.o-headline2 { + color: var(--color-dark-secondary); + font-size: 3em +} + +.js-span-station-name { + color: var(--color-dark-text-1); + font-size: 1.5em +} + +.o-table table{ + color: var(--color-dark-text-1); + font-size: 2em +} + +.o-transport-icon { + transform: scale(2); + color: var(--color-argon-600); + margin-left: 20px !important; +} + +.c-departures-monitor__delay-time.is-late { + color: #ff3719; +} + +.c-departures-monitor__delay-time.is-on-time { + color: #009900; +} + +.c-departures-monitor__logo { + opacity: 0.7 +} + +body { + background-color: #141414; +} +.js-span-station-name { + margin: 0 !important; +} + +.o-transport-icon--transparent .o-transport-icon__number { +color: #faf5f5 !important; +} + + `); +})(); diff --git a/tampermonkey/mastodon.js b/tampermonkey/mastodon.js new file mode 100644 index 0000000..7e05e90 --- /dev/null +++ b/tampermonkey/mastodon.js @@ -0,0 +1,130 @@ +// ==UserScript== +// @name Mastodon Styling (39C3 Kiosk) +// @namespace http://tampermonkey.net/ +// @version 2025-12-18 +// @description Reduces actions not required to serve a Kiosk at 39C3 +// @author You +// @match https://chaos.social/tags/39c3/ +// @icon https://www.google.com/s2/favicons?sz=64&domain=chaos.social +// @grant GM_addStyle +// ==/UserScript== + +(function() { + 'use strict'; + + GM_addStyle(` +.columns-area__panels__pane.columns-area__panels__pane--compositional { + display: none; +} + +.columns-area__panels__pane.columns-area__panels__pane--start.columns-area__panels__pane--navigational { + display: none; +} + +div#tabs-bar__portal { + display: none; +} + +.hashtag-header__header__buttons { + display: none; +} + +span.display-name { + background-color: #9673ff; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +span.display-name * { + display: inline !important; + font-weight: normal !important; + color: black !important; + text-transform: uppercase; +} + +span.display-name__account::before { + content: '('; +} + +span.display-name__account::after { + content: ')'; +} + +.hashtag-header__header__buttons { + display: none; +} + +span.display-name, .status__relative-time { + background-color: #9673ff; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + padding: 5px 5px 2px; +} + +span.display-name *, .status__relative-time { + display: inline !important; + font-weight: normal !important; + color: black !important; + text-transform: uppercase; + height: auto; +} + +span.display-name__account::before { + content: '('; +} + +span.display-name__account::after { + content: ')'; +} + +.status { + border-bottom: 0 !important; +} +.status p { + color: rgba(250, 245, 245, 0.8) !important; +} +.status p a{ + color: rgba(102, 246, 102) !important; +} + +.status__action-bar { + display: none !important; +} + +.column>.scrollable { + border: 0 !important; + background: transparent !important; +} + +article { + background-color: #242424; + border-radius: 0.375rem; + margin-bottom: 40px !important; +} + +.columns-area__panels__main { + max-width: 60vw; +} + +.hashtag-bar a { + --hub-tag-bg: transparent; + --hub-tag-border: 1px solid #9673ff; + --hub-tag-color: #9673ff; + --bs-border-radius: 0.375rem; + background-color: var(--hub-tag-bg); + border-radius: var(--bs-border-radius) 0; + border: var(--hub-tag-border); + color: var(--hub-tag-color); + display: inline-flex; + gap: 5px; + min-width: 0; + overflow: hidden; + padding: 5px 5px 2px; + text-overflow: ellipsis; + text-transform: uppercase; + white-space: nowrap; +} + +.hashtag-header { + display: none; +} + `); +})();