{"id":17465458,"url":"https://github.com/suhlig/kiosk","last_synced_at":"2026-05-17T04:38:24.712Z","repository":{"id":147398798,"uuid":"116054184","full_name":"suhlig/kiosk","owner":"suhlig","description":"Turns a Raspberry Pi into a simple browser kiosk","archived":false,"fork":false,"pushed_at":"2024-11-10T12:25:14.000Z","size":128,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-20T12:36:59.150Z","etag":null,"topics":["academic","kiosk","raspberry-pi","spike"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suhlig.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-02T20:28:23.000Z","updated_at":"2024-11-10T12:25:18.000Z","dependencies_parsed_at":"2023-05-25T06:00:45.861Z","dependency_job_id":null,"html_url":"https://github.com/suhlig/kiosk","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/suhlig/kiosk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suhlig%2Fkiosk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suhlig%2Fkiosk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suhlig%2Fkiosk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suhlig%2Fkiosk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suhlig","download_url":"https://codeload.github.com/suhlig/kiosk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suhlig%2Fkiosk/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261479786,"owners_count":23164764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["academic","kiosk","raspberry-pi","spike"],"created_at":"2024-10-18T11:42:44.596Z","updated_at":"2026-05-17T04:38:19.691Z","avatar_url":"https://github.com/suhlig.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kiosk\n\nTurns a Raspberry Pi into a simple browser kiosk. A Go program controls a full-screen Chromium browser.\n\n# Preparation\n\n1. Configure the OS image using the [Raspberry Pi Imager](https://www.raspberrypi.com/software/):\n\n   - Set hostname\n   - Enable SSH\n   - Configure a non-default user\n   - Configure WLAN\n   - Set the locale\n\n1. After first boot, use `raspi-config` to:\n\n   - Auto-boot into the graphical environment without asking for login credentials\n   - Disable screen blanking\n\n# Kiosk Controller\n\nThe official touch screen makes a great secondary display for the `kiosk-controller`. Add or change the following lines in `/boot/config.txt`:\n\n* Rotate the touchscreen by 180°:\n\n  ```\n  lcd_rotate=2\n  ```\n\n* Switch to FKMS mode:\n\n  ```\n  dtoverlay=vc4-fkms-v3d\n  ```\n\n  Make sure it's `fkms`, and not `kms`.\n\n# Config File\n\nThe URL of the browser is described in a YAML file that is passed as argument or via `STDIN` to the `kiosk` binary. If multiple entries are present, they will be opened as browser tabs and switched between every `--interval`; e.g. `10s`.\n\nExample:\n\n```yaml\n- name: org\n  script:\n    - go: https://example.org\n    - click: //p/a\n- name: com\n  script:\n    - go: https://example.com\n- name: net\n  script:\n    - go: https://example.net\n```\n\n# TODO\n\n- Deal with default values of controller.StatusUpdate - we don't want to send `IsTabSwitching = false` just because we did not know the current value\n  * pointers (and skip nil pointers)\n  * always query everything (maybe not ideal)\n- At page load, set initial status of display power\n- If displays are powered off, power-up the controller if touched (catching a click in any part of the page)\n- Update the status of the power checkbox if changed on the server side\n- stream image updates (no need to reload images)\n- keep updating screenshots while switching is paused (may be impossible)\n- make the current page the one shown when loading the controller\n- add another service to run the kiosk controller on the touch screen:\n\n  ```command\n  $ chromium-browser --kiosk http://localhost:8011\n  ```\n- re-configure tab switching time in the controller\n- deploy using pipeline\n- test pages for presence of some element, otherwise close tab and restart (e.g. when authenticated session expires)\n- refresh pages that are not self-refreshing (e.g. [reload](https://github.com/chromedp/chromedp/blob/a3b306adf4a8348197a7927cacf3e77077121dd5/nav.go#L89))\n  - also useful as HTTP command\n- configure `lcd_rotate=2` and `dtoverlay=vc4-fkms-v3d` via Ansible\n- `unclutter -idle 0.5 -root \u0026` if needed\n- [splash screen at boot](https://github.com/guysoft/FullPageOS/blob/master/src/modules/fullpageos/filesystem/root_init/etc/systemd/system/splashscreen.service)\n- Turn displays on and off via HTTP or cron:\n\n  ```command\n  # Touch Screen (primary monitor)\n  $ vcgencmd display_power 0 0\n  $ vcgencmd display_power 1 0\n\n  # HDMI\n  $ vcgencmd display_power 0 2\n  $ vcgencmd display_power 1 2\n  ```\n\n  Alternatively:\n\n  * Touchscreen\n\n    ```command\n    $ sudo zsh -c \"echo 1 \u003e /sys/class/backlight/rpi_backlight/bl_power\" # off\n    $ sudo zsh -c \"echo 0 \u003e /sys/class/backlight/rpi_backlight/bl_power\" # on\n    ```\n\n\n  * HDMI (`2` is the HDMI port; use `tvservice --list` to list)\n\n    ```command\n    $ tvservice -o -v 2\n    $ tvservice -p -v 0\n    ```\n\n# Deployment\n\n## Build the `kiosk` binary\n\nFor the Raspberry Pi 4, this is\n\n```command\n$ GOARM=7 GOARCH=arm GOOS=linux go build\n```\n\n## Prerequisites on the Deployer's Workstation\n\n* Make sure you have a recent [Ansible installation](http://docs.ansible.com/ansible/intro_installation.html):\n\n  ```bash\n  $ brew install ansible\n  ```\n\n  Replace `brew` with `yum` or `apt-get`, depending on your OS.\n\n* Install the required Ansible roles:\n\n  ```bash\n  $ ansible-galaxy install -r roles.yml\n  ```\n\n* Update `inventory.yml` with the host(s) to deploy to\n\n## Deploy\n\nRun the playbook:\n\n```bash\n$ ansible-playbook playbook.yml\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuhlig%2Fkiosk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuhlig%2Fkiosk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuhlig%2Fkiosk/lists"}