From 46a73dfb9e6c3cf6cec952ad15bfbe4f9a9ae55e Mon Sep 17 00:00:00 2001 From: n0th1ng Date: Thu, 18 Dec 2025 21:20:35 +0100 Subject: [PATCH 1/9] Added a systemd service, as well as sway --- post_install.sh | 54 ++++++++++++++++++++++++++++++++++++++++++++++--- preseed.cfg | 3 ++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/post_install.sh b/post_install.sh index 8c9659e..b2fdc19 100644 --- a/post_install.sh +++ b/post_install.sh @@ -1,4 +1,7 @@ printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf + + +# Firefox policy mkdir -p /usr/lib/firefox-esr/distribution tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' { @@ -53,10 +56,55 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' } } EOF -chown -R kiosk:kiosk /home/kiosk/.config +# Bash autostart of sway tee /home/kiosk/.bash_profile > /dev/null <<'EOF' if [ -z "$WAYLAND_DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then - exec cage firefox --kiosk https://c3nav.de + exec sway fi -EOF \ No newline at end of file +EOF + +# Sway config +mkdir -p /home/kiosk/.config/sway/ +tee /home/kiosk/.config/sway/config > /dev/null <<'EOF' +input type:pointer { + events disabled +} + +input type:keyboard { + events disabled +} + +input type:touch { + events enabled +} + +input * xkb_layout de + +## This may not be needed if there is a systemd unit +# exec_always firefox --wayland --kiosk +EOF + + +# Systemd unit +mkdir -p /home/kiosk/.config/systemd/user/ +tee /home/kiosk/.config/systemd/user/firefox-kiosk.service > /dev/null <<'EOF' +service +[Unit] +Description=Firefox im Kiosk-Mode + +[Service] +Type=simple +TimeoutStartSec=0 +ExecStart=/usr/bin/firefox --kiosk +Environment=DISPLAY=:0 +Restart=always + +[Install] +WantedBy=default.target +EOF +mkdir -p /home/kiosk/.config/systemd/user/default.target.wants/ +ln -s /home/kiosk/.config/systemd/user/firefox-kiosk.service /home/kiosk/.config/systemd/user/default.target.wants/firefox-kiosk.service + + +chown -R kiosk:kiosk /home/kiosk/.config \ No newline at end of file diff --git a/preseed.cfg b/preseed.cfg index b934651..9845da0 100644 --- a/preseed.cfg +++ b/preseed.cfg @@ -53,7 +53,8 @@ d-i pkgsel/include string \ sudo \ cage \ firefox-esr \ - curl + curl \ + sway d-i pkgsel/exclude string gnome-software From fff52cfcee98cf5f38aa8a236bf7c958a34e348b Mon Sep 17 00:00:00 2001 From: n0th1ng Date: Thu, 18 Dec 2025 22:44:07 +0100 Subject: [PATCH 2/9] Added to the firefox policy --- post_install.sh | 96 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/post_install.sh b/post_install.sh index b2fdc19..5b8c7fc 100644 --- a/post_install.sh +++ b/post_install.sh @@ -2,16 +2,29 @@ printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\ # Firefox policy -mkdir -p /usr/lib/firefox-esr/distribution -tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' +# (I used to put this in /etc/firefox/policies/policies.json instead) +mkdir -p /usr/lib/firefox-esr/distribution +tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' { "policies": { + "AppAutoUpdate": true, + "BackgroundAppUpdate": true, + "BlockAboutAddons": true, + "BlockAboutConfig": true, + "BlockAboutProfiles": true, + "BlockAboutSupport": true, "DisableDeveloperTools": true, "BlockAboutAddons": true, "BlockAboutConfig": true, "BlockAboutProfiles": true, "BlockAboutSupport": true, + "DisableFeedbackCommands": true, "DisableFirefoxAccounts": true, + "DisableFirefoxScreenshots": true, + "DisableFirefoxStudies": true, + "DisableForgetButton": true, + "DisableFormHistory": true, + "DisablePocket": true, "DisablePrivateBrowsing": true, "DisableProfileImport": true, "DisableProfileRefresh": true, @@ -19,10 +32,33 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' "DisablePocket": true, "DisableFirefoxScreenshots": true, "DisableSetDesktopBackground": true, + "DisableTelemetry": true, + "DisplayBookmarksToolbar": "never", + "DisplayMenuBar": "never", + "EnableTrackingProtection": { + "Cryptomining": true, + "Fingerprinting": true, + "Value": true + }, + "ExtensionSettings": { + "*": { + "installation_mode": "allowed" + } + }, + "FirefoxHome": { + "Highlights": false, + "Pocket": false, + "Search": false, + "SponsoredPocket": false, + "SponsoredTopSites": false, + "TopSites": false + }, "Homepage": { + "StartPage": "homepage", "URL": "https://mahn.ke", "Locked": true }, + "ManualAppUpdateOnly": true, "NewTabPage": { "Enabled": false }, @@ -30,6 +66,21 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' "Path": "C:\\KioskDownloads", "Locked": true }, + "PictureInPicture": { + "Enabled": false + }, + "Preferences": { + "extensions.getAddons.showPane": { + "Status": "locked", + "Type": "boolean", + "Value": false + }, + "ui.key.menuAccessKeyFocuses": { + "Status": "locked", + "Type": "boolean", + "Value": false + } + }, "PromptForDownloadLocation": false, "StartDownloadsInTempDirectory": false, "DisableAppUpdate": true, @@ -39,19 +90,40 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' "Location": "deny", "Notifications": "deny" }, + "SanitizeOnShutdown": { + "Cache": true, + "Cookies": true, + "Downloads": true, + "FormData": true, + "History": true, + "OfflineApps": true, + "Sessions": true, + "SiteSettings": true + }, "ShowHomeButton": false, + "UserMessaging": { + "ExtensionRecommendations": false, + "FeatureRecommendations": false, + "MoreFromMozilla": false, + "SkipOnboarding": false, + "UrlbarInterventions": false, + "WhatsNew": false, + "FirefoxLabs": false, + "Locked": false + }, "DisplayMenuBar": false, "DisplayBookmarksToolbar": false, - "policies": { - "UserMessaging": { - "ExtensionRecommendations": false, - "FeatureRecommendations": false, - "UrlbarInterventions": false, - "SkipOnboarding": false, - "MoreFromMozilla": false, - "FirefoxLabs": false, - "Locked": false - } + "WebsiteFilter": { + "Block": [ + "" + ], + "Exceptions": [ + "*://*.c3nav.de/*", + "*://*.hvv.de/*", + "*://engel.events.ccc.de/*", + "*://*.chaos.social/*", + "*://*.events.ccc.de/*" + ] } } } From 84281c058648cd18ee702d772766cf1a170670e8 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Mon, 22 Dec 2025 07:26:01 +0100 Subject: [PATCH 3/9] 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; +} + `); +})(); From b828dcd15f6c31edbfadf729d9803c12b932d724 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Fri, 26 Dec 2025 12:06:44 +0100 Subject: [PATCH 4/9] feat: Adds build pipeline --- .github/workflows/kiosk-iso.yml | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/kiosk-iso.yml diff --git a/.github/workflows/kiosk-iso.yml b/.github/workflows/kiosk-iso.yml new file mode 100644 index 0000000..ec9154b --- /dev/null +++ b/.github/workflows/kiosk-iso.yml @@ -0,0 +1,43 @@ +name: Build NixOS Kiosk ISO + +on: + push: + branches: [ profile-install ] + workflow_dispatch: + +jobs: + flake-check: + runs-on: ubuntu-latest + container: + image: nixos/nix:2.33.0 + env: + NIX_CONFIG: extra-experimental-features = nix-command flakes + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Flake check + run: nix flake check -L + + build-iso: + runs-on: ubuntu-latest + needs: [ flake-check ] + container: + image: nixos/nix:2.33.0 + env: + NIX_CONFIG: extra-experimental-features = nix-command flakes + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Build ISO + run: | + nix --version + nix build .#iso -L --system x86_64-linux + ls -la result + mkdir -p artifacts + cp -v result/iso/*.iso artifacts/ + - name: Upload ISO artifact + uses: actions/upload-artifact@v4 + with: + name: kiosk-iso + path: artifacts/*.iso + if-no-files-found: error From 2d771638b4933bb2654e5b50e8ee6b6a8ebea644 Mon Sep 17 00:00:00 2001 From: Vincent Mahnke Date: Fri, 26 Dec 2025 16:00:55 +0100 Subject: [PATCH 5/9] feat: Replaces nix dependencies from container --- .github/workflows/kiosk-iso.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/kiosk-iso.yml b/.github/workflows/kiosk-iso.yml index ec9154b..82d2f2d 100644 --- a/.github/workflows/kiosk-iso.yml +++ b/.github/workflows/kiosk-iso.yml @@ -8,26 +8,32 @@ on: jobs: flake-check: runs-on: ubuntu-latest - container: - image: nixos/nix:2.33.0 env: NIX_CONFIG: extra-experimental-features = nix-command flakes steps: - name: Checkout uses: actions/checkout@v4 + - name: Install Nix + run: | + curl -L https://nixos.org/nix/install | sh + . /home/runner/.nix-profile/etc/profile.d/nix.sh + nix --version - name: Flake check run: nix flake check -L build-iso: runs-on: ubuntu-latest needs: [ flake-check ] - container: - image: nixos/nix:2.33.0 env: NIX_CONFIG: extra-experimental-features = nix-command flakes steps: - name: Checkout uses: actions/checkout@v4 + - name: Install Nix + run: | + curl -L https://nixos.org/nix/install | sh + . /home/runner/.nix-profile/etc/profile.d/nix.sh + nix --version - name: Build ISO run: | nix --version From 4cf6e46a7bd59abbebda4ae917109ced251ca17a Mon Sep 17 00:00:00 2001 From: vieta Date: Sat, 27 Dec 2025 15:18:10 +0100 Subject: [PATCH 6/9] base desktop --- desktop/README.md | 8 + desktop/config.toml | 20 +++ desktop/firefox.sh | 2 + desktop/kiosk-setting/sway/config | 165 ++++++++++++++++++ .../sway/config.d/50-systemd-user.conf | 9 + desktop/kiosk-setting/sway/loop.sh | 5 + desktop/setup.sh | 7 + desktop/sway/.config.swp | Bin 0 -> 12288 bytes desktop/sway/config | 104 +++++++++++ desktop/sway/config.d/50-systemd-user.conf | 9 + desktop/sway/ffrun.sh | 11 ++ desktop/sway/preseed | 1 + post_install.sh | 7 +- 13 files changed, 345 insertions(+), 3 deletions(-) create mode 100644 desktop/README.md create mode 100755 desktop/config.toml create mode 100755 desktop/firefox.sh create mode 100755 desktop/kiosk-setting/sway/config create mode 100755 desktop/kiosk-setting/sway/config.d/50-systemd-user.conf create mode 100755 desktop/kiosk-setting/sway/loop.sh create mode 100755 desktop/setup.sh create mode 100755 desktop/sway/.config.swp create mode 100755 desktop/sway/config create mode 100755 desktop/sway/config.d/50-systemd-user.conf create mode 100755 desktop/sway/ffrun.sh create mode 160000 desktop/sway/preseed diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000..384d819 --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,8 @@ +# Kioskmodus +- Firefox autostart +- Sway +- Restart Firefox via short cut: ALT+Enter +- Close Firefox via short cut: ALT+Q +## Systemd Service für restart +- Inaktiv wegen wayland + diff --git a/desktop/config.toml b/desktop/config.toml new file mode 100755 index 0000000..d0ad293 --- /dev/null +++ b/desktop/config.toml @@ -0,0 +1,20 @@ +[terminal] +# The VT to run the greeter on. Can be "next", "current" or a number +# designating the VT. +vt = 1 + +# The default session, also known as the greeter. +[default_session] +# with whatever you want started, such as `sway`. +command = "sway --config /etc/kiosk-setting/sway/config" +# if using wlgreet +#command = "sway --config /etc/greetd/sway-config" +# The user to run the command as. The privileges this user must have depends +# on the greeter. A graphical greeter may for example require the user to be +# in the `video` group. +user = "kiosk1" + +[initial_session] +command = "sway'" +user = "kiosk1" + diff --git a/desktop/firefox.sh b/desktop/firefox.sh new file mode 100755 index 0000000..3a703e2 --- /dev/null +++ b/desktop/firefox.sh @@ -0,0 +1,2 @@ +#!/bin/bash +killall firefox && firefox --kiosk mahn.ke/kiosk diff --git a/desktop/kiosk-setting/sway/config b/desktop/kiosk-setting/sway/config new file mode 100755 index 0000000..36b733a --- /dev/null +++ b/desktop/kiosk-setting/sway/config @@ -0,0 +1,165 @@ +# Default config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. +exec firefox kiosk mahn.ke/kiosk + + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod1 +# Home row direction keys, like vim +#set $left h +#set $down j +#set $up k +#set $right l +# Your preferred application launcher +set $menu wmenu-run + +include /etc/sway/config-vars.d/* + +bindsym $mod+Return firefox kiosk mahn.ke/kiosk +bindsym $mod+q kill + + # Start your launcher + # bindsym $mod+d exec $menu + + # floating_modifier $mod normal + + # Reload the configuration file + # bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' +# + # Move your focus around + #bindsym $mod+$left focus left + #bindsym $mod+$down focus down + #bindsym $mod+$up focus up + #bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + #bindsym $mod+Left focus left + #bindsym $mod+Down focus down + #bindsym $mod+Up focus up + #bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + #bindsym $mod+Shift+$left move left + #bindsym $mod+Shift+$down move down + #bindsym $mod+Shift+$up move up + #bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + # bindsym $mod+Shift+Left move left + # bindsym $mod+Shift+Down move down + # bindsym $mod+Shift+Up move up + #bindsym $mod+Shift+Right move right +# +# Workspaces: +# + # Switch to workspace + # bindsym $mod+1 workspace number 1 + # bindsym $mod+2 workspace number 2 + # bindsym $mod+3 workspace number 3 + # bindsym $mod+4 workspace number 4 + # bindsym $mod+5 workspace number 5 + #bindsym $mod+6 workspace number 6 + #bindsym $mod+7 workspace number 7 + #bindsym $mod+8 workspace number 8 + #bindsym $mod+9 workspace number 9 + #bindsym $mod+0 workspace number 10 + # Move focused container to workspace + #bindsym $mod+Shift+1 move container to workspace number 1 + #bindsym $mod+Shift+2 move container to workspace number 2 + #bindsym $mod+Shift+3 move container to workspace number 3 + #bindsym $mod+Shift+4 move container to workspace number 4 + #bindsym $mod+Shift+5 move container to workspace number 5 + #bindsym $mod+Shift+6 move container to workspace number 6 + #bindsym $mod+Shift+7 move container to workspace number 7 + #bindsym $mod+Shift+8 move container to workspace number 8 + #bindsym $mod+Shift+9 move container to workspace number 9 + #bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + #bindsym $mod+b splith + #bindsym $mod+v splitv + + # Switch the current container between different layout styles + #bindsym $mod+s layout stacking + #bindsym $mod+w layout tabbed + #bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + #bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + #bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + #bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + #bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + #bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + #bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +#mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + # bindsym $left resize shrink width 10px + # bindsym $down resize grow height 10px + # bindsym $up resize shrink height 10px + # bindsym $right resize grow width 10px + + # Ditto, with arrow keys + # bindsym Left resize shrink width 10px + # bindsym Down resize grow height 10px + # bindsym Up resize shrink height 10px + # bindsym Right resize grow width 10px + + # Return to default mode + # bindsym Return mode "default" + # bindsym Escape mode "default" +#} +#bindsym $mod+r mode "resize" +# +# Utilities: +# + # Special keys to adjust volume via PulseAudio + # bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle + # bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5% + # bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5% + #bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle + # Special keys to adjust brightness via brightnessctl + # bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%- + # bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+ + # Special key to take a screenshot with grim + # bindsym Print exec grim + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. + +include /etc/sway/config.d/* diff --git a/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf b/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf new file mode 100755 index 0000000..ab04a90 --- /dev/null +++ b/desktop/kiosk-setting/sway/config.d/50-systemd-user.conf @@ -0,0 +1,9 @@ +# import variables into system-user enviroment +# based on the instructions in the sway wiki +# see also https://github.com/swaywm/sway/issues/5732 +# and https://github.com/systemd/systemd/blob/dfc637d0ff756889e8e5b7cb4ec991eb06069aa1/xorg/50-systemd-user.sh + +exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP + +exec hash dbus-update-activation-environment 2>/dev/null && \ + dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway diff --git a/desktop/kiosk-setting/sway/loop.sh b/desktop/kiosk-setting/sway/loop.sh new file mode 100755 index 0000000..419919c --- /dev/null +++ b/desktop/kiosk-setting/sway/loop.sh @@ -0,0 +1,5 @@ +#!/bin/bash +while true; do + ./firefox.sh + sleep 1 +done diff --git a/desktop/setup.sh b/desktop/setup.sh new file mode 100755 index 0000000..77d1d11 --- /dev/null +++ b/desktop/setup.sh @@ -0,0 +1,7 @@ +#!/bin/sh +sudo cp -r kiosk-setting /etc/ && \ +sudo cp firefox.sh /usr/bin/firefox.sh && \ +sudo apt install greetd sway && \ +sudo cp config.toml /etc/greetd/config.toml && \ +sudo reboot + diff --git a/desktop/sway/.config.swp b/desktop/sway/.config.swp new file mode 100755 index 0000000000000000000000000000000000000000..8a0e42725234885723daeafa05f31c0d825d09c5 GIT binary patch literal 12288 zcmYc?2=nw+u+%eTU|?VnU|>i%;F-xJ(8a*O#lTRMpI-tJCWKQ`lQI+Ybd!^lGcxe0 z)z8S!P1VoN%rDN?*GtaNOUq2xFD_54)Q7O~X&sdt4S~@RpdUwoq^#d8w107HU@@P zHU@?kHU@@tHU6hpr4wFV3s6<7h|9apmAY~HQ)w7bwQSJKt-|Xfs4Tym^MSqNY_iz*J4m+P*w;o zNh~QXR&YuzvSLtXU{Fv{P)N$mODV3*RR}1`%qvkytw>E)NH5CF1i_ae6Vx?TIN_rNt!* z2#XcUG82)w$t5{pomlO6EKSMG_svZ9EiFlfSY40^b+~SEerZv1s%|bwD#pRZ)y*-~ zCnP@DKQzeM)j^>oKRrDsm4L}XiJ8TzVfi_wxtOMB=4I=aL8OpO_w@62P|!A2C19{m zetBvU=?3c(G#G0@fSigR3}A;M1p>~9f%*{?DFLN9#i`&R2dCQ5lFXdUlFZa%P@=6x z@v&=ha$-TMLT-Las)ABVYFc7xPKgqVilEez(xNYGpC17gWG`4Q3KPKd6)v>j{+xZKN>#`$%_+$&$Vo+3Tb`Mhl3!k|qfnBOS*(zppPQSQm!gnd znVgeatWc6slwX>j0Wu<24{Bm?Mt(U+Kp`)+q6E_*cZVWnQ0~3kW7)AUzVx>4r8#TSk#3UD1a4}7T{6=&J18Rpd^4x6*wn=Re|CO ztO{q+#|U_clcAXaYzSUAgYp1a6>djE53` zP+FX-08R_hr3E!0y)_{D8gQV-g5w4yB|rlnViH&p7B!{#oC*nUhyft`u;>T50P0x~ z6Rbj60UXqo`K3irsl=lE(!3O~B#INkVXO_UdO^!)^Agh)bW0S<6N~adIa@bZK|M0R zRH2|KwHTC9K(Ulsky!%D!bK&?r6qa_F8K)P4)=_|KR98?3IViU{9W15} zcD%BJE70x8Y%z}Y7;r#N4sJijQrSRpOHNFgsjPZ#EJ1xSV~hPee?fP?ks zLNX!PWK`R=!JdTaa4AYmS3oyTA*oU!BR?kv6wd zHiN)zf0dHdB6#D!B(bPOAyEM&l$n>91Fr6z5{omFi>(;Isu89ZF~E8u`l%=#m~`E; z#G+zw4}<~Q%8F0QFG@)TM@lLK0|Th>uacXZSE^7BB6W*O^B9yBB0<@/dev/null && \ + dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway diff --git a/desktop/sway/ffrun.sh b/desktop/sway/ffrun.sh new file mode 100755 index 0000000..a46b0fd --- /dev/null +++ b/desktop/sway/ffrun.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +APP_NAME="firefox-esr" +APP_COMMAND="firefox-esr" + +while true; do + if ! pgrep -x "$APP_NAME" > /dev/null; then + swaymsg exec "$APP_COMMAND" + fi + sleep 1 # Wait a second before checking again +done + diff --git a/desktop/sway/preseed b/desktop/sway/preseed new file mode 160000 index 0000000..84281c0 --- /dev/null +++ b/desktop/sway/preseed @@ -0,0 +1 @@ +Subproject commit 84281c058648cd18ee702d772766cf1a170670e8 diff --git a/post_install.sh b/post_install.sh index 8c9659e..cd302f1 100644 --- a/post_install.sh +++ b/post_install.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bassh printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf mkdir -p /usr/lib/firefox-esr/distribution tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' @@ -6,7 +7,7 @@ tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' "DisableDeveloperTools": true, "BlockAboutAddons": true, "BlockAboutConfig": true, - "BlockAboutProfiles": true, + "BlockAboutProf#!/usr/bin/env basshiles": true, "BlockAboutSupport": true, "DisableFirefoxAccounts": true, "DisablePrivateBrowsing": true, @@ -57,6 +58,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 cage firefox --kiosk https://c3nav.de + exec cage firefox --kiosk mahn.ke/kiosk fi -EOF \ No newline at end of file +EOF From b29e81fe2996bdaaa45de4d9071951528f703114 Mon Sep 17 00:00:00 2001 From: vieta Date: Sat, 27 Dec 2025 15:25:20 +0100 Subject: [PATCH 7/9] base desktop + preseed v01 --- desktop/config.toml | 4 ++-- desktop/kiosk-setting/sway/config | 4 +--- desktop/setup.sh | 3 +-- post_install.sh | 5 +++-- setup.sh | 7 +++++++ 5 files changed, 14 insertions(+), 9 deletions(-) create mode 100755 setup.sh diff --git a/desktop/config.toml b/desktop/config.toml index d0ad293..76abbc8 100755 --- a/desktop/config.toml +++ b/desktop/config.toml @@ -12,9 +12,9 @@ command = "sway --config /etc/kiosk-setting/sway/config" # The user to run the command as. The privileges this user must have depends # on the greeter. A graphical greeter may for example require the user to be # in the `video` group. -user = "kiosk1" +user = "kiosk" [initial_session] command = "sway'" -user = "kiosk1" +user = "kiosk" diff --git a/desktop/kiosk-setting/sway/config b/desktop/kiosk-setting/sway/config index 36b733a..780f59f 100755 --- a/desktop/kiosk-setting/sway/config +++ b/desktop/kiosk-setting/sway/config @@ -3,9 +3,7 @@ # Copy this to ~/.config/sway/config and edit it to your liking. # # Read `man 5 sway` for a complete reference. -exec firefox kiosk mahn.ke/kiosk - - +#exec firefox kiosk mahn.ke/kiosk ### Variables # # Logo key. Use Mod1 for Alt. diff --git a/desktop/setup.sh b/desktop/setup.sh index 77d1d11..7d2250f 100755 --- a/desktop/setup.sh +++ b/desktop/setup.sh @@ -1,7 +1,6 @@ #!/bin/sh -sudo cp -r kiosk-setting /etc/ && \ -sudo cp firefox.sh /usr/bin/firefox.sh && \ sudo apt install greetd sway && \ +sudo cp -r desktop/kiosk-setting/ /etc/ && \ sudo cp config.toml /etc/greetd/config.toml && \ sudo reboot diff --git a/post_install.sh b/post_install.sh index cd302f1..1a9fa92 100644 --- a/post_install.sh +++ b/post_install.sh @@ -1,5 +1,6 @@ -#!/usr/bin/env bassh -printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf +#!/usr/bin/env bash +#printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf + mkdir -p /usr/lib/firefox-esr/distribution tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' { diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..3736f0a --- /dev/null +++ b/setup.sh @@ -0,0 +1,7 @@ +#!/bin/sh +sudo apt install greetd sway && \ +sudo cp -r desktop/kiosk-setting/ /etc/ && \ +sudo cp config.toml /etc/greetd/config.toml && \ +./post_install.sh +sudo reboot + From 5663982dac18d013b4a6f67e148fb2172b4618fd Mon Sep 17 00:00:00 2001 From: vieta Date: Sun, 28 Dec 2025 16:18:12 +0100 Subject: [PATCH 8/9] base desktop + preseed v02 --- post_install.sh | 0 setup.sh | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 post_install.sh diff --git a/post_install.sh b/post_install.sh old mode 100644 new mode 100755 diff --git a/setup.sh b/setup.sh index 3736f0a..3a1e0e0 100755 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,7 @@ #!/bin/sh -sudo apt install greetd sway && \ -sudo cp -r desktop/kiosk-setting/ /etc/ && \ -sudo cp config.toml /etc/greetd/config.toml && \ +apt install greetd sway && \ +cp -r desktop/kiosk-setting/ /etc/ && \ +cp config.toml /etc/greetd/config.toml && \ +systemctl enable greetd && \ ./post_install.sh -sudo reboot From 2ee43d2269644a954a308eaf2f6df04cfcbb7e45 Mon Sep 17 00:00:00 2001 From: vieta Date: Sun, 28 Dec 2025 16:40:15 +0100 Subject: [PATCH 9/9] base desktop + preseed v03 --- post_install.sh => profile/post_install.sh | 2 +- preseed.cfg => profile/preseed.cfg | 0 {tampermonkey => profile/tampermonkey}/backtohome.js | 0 {tampermonkey => profile/tampermonkey}/hvv.js | 0 {tampermonkey => profile/tampermonkey}/mastodon.js | 0 setup.sh | 9 ++++----- 6 files changed, 5 insertions(+), 6 deletions(-) rename post_install.sh => profile/post_install.sh (92%) rename preseed.cfg => profile/preseed.cfg (100%) rename {tampermonkey => profile/tampermonkey}/backtohome.js (100%) rename {tampermonkey => profile/tampermonkey}/hvv.js (100%) rename {tampermonkey => profile/tampermonkey}/mastodon.js (100%) diff --git a/post_install.sh b/profile/post_install.sh similarity index 92% rename from post_install.sh rename to profile/post_install.sh index 1a9fa92..6b4889a 100755 --- a/post_install.sh +++ b/profile/post_install.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -#printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf +printf "[daemon]\nAutomaticLoginEnable=true\nAutomaticLogin=kiosk\n\n[security]\n\n[xdmcp]\n\n[chooser]\n\n[debug]\n" > /etc/gdm3/daemon.conf mkdir -p /usr/lib/firefox-esr/distribution tee /usr/lib/firefox-esr/distribution/policies.json > /dev/null <<'EOF' diff --git a/preseed.cfg b/profile/preseed.cfg similarity index 100% rename from preseed.cfg rename to profile/preseed.cfg diff --git a/tampermonkey/backtohome.js b/profile/tampermonkey/backtohome.js similarity index 100% rename from tampermonkey/backtohome.js rename to profile/tampermonkey/backtohome.js diff --git a/tampermonkey/hvv.js b/profile/tampermonkey/hvv.js similarity index 100% rename from tampermonkey/hvv.js rename to profile/tampermonkey/hvv.js diff --git a/tampermonkey/mastodon.js b/profile/tampermonkey/mastodon.js similarity index 100% rename from tampermonkey/mastodon.js rename to profile/tampermonkey/mastodon.js diff --git a/setup.sh b/setup.sh index 3a1e0e0..50213a9 100755 --- a/setup.sh +++ b/setup.sh @@ -1,7 +1,6 @@ -#!/bin/sh -apt install greetd sway && \ +#!/usr/bin/env bash +apt install gdm3 greetd sway && \ cp -r desktop/kiosk-setting/ /etc/ && \ cp config.toml /etc/greetd/config.toml && \ -systemctl enable greetd && \ -./post_install.sh - +systemctl enable gdm3 && \ # greetd if gdm3 is buggy +./profile/post_install.sh