├── .gitignore
├── .travis.yml
├── LICENSE
├── PKGBUILD
├── README.md
├── artwork
├── dashboard.afdesign
└── dashboard.png
├── dashboard.pam
├── dashboard.service
├── dashboard.sysusers
├── dashboard.tmpfiles
├── scheduled-reboot.service
└── scheduled-reboot.timer
/.gitignore:
--------------------------------------------------------------------------------
1 | src/
2 | pkg/
3 | *.xz
4 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 |
3 | services:
4 | - docker
5 |
6 | arch:
7 | script:
8 | - "sudo pacman -Sy"
9 | - "makepkg -si --noconfirm"
10 | - "sudo pacman -R dashboard --noconfirm"
11 |
12 | script:
13 | - "curl -s https://raw.githubusercontent.com/mikkeloscar/arch-travis/master/arch-travis.sh | bash"
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014-2023 Nils Werner
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/PKGBUILD:
--------------------------------------------------------------------------------
1 | pkgname=dashboard
2 | pkgver=3.0
3 | pkgrel=1
4 | pkgdesc="Browser based dashboard display on Raspberry Pi"
5 | arch=('any')
6 | url="https://github.com/nils-werner/arch-dashboard/"
7 | license=('MIT')
8 | depends=(
9 | 'cage'
10 | 'luakit'
11 | 'xorg-xwayland'
12 | )
13 | source=(
14 | 'dashboard.service'
15 | 'dashboard.sysusers'
16 | 'dashboard.tmpfiles'
17 | 'dashboard.pam'
18 | 'scheduled-reboot.service'
19 | 'scheduled-reboot.timer'
20 | )
21 | sha256sums=(
22 | 'SKIP'
23 | 'SKIP'
24 | 'SKIP'
25 | 'SKIP'
26 | 'SKIP'
27 | 'SKIP'
28 | )
29 |
30 | build() {
31 | :
32 | }
33 |
34 | package() {
35 | install -Dm644 "$srcdir/dashboard.service" "$pkgdir/usr/lib/systemd/system/dashboard.service"
36 | install -Dm644 "${srcdir}/dashboard.sysusers" "${pkgdir}/usr/lib/sysusers.d/dashboard.conf"
37 | install -Dm644 "${srcdir}/dashboard.tmpfiles" "${pkgdir}/usr/lib/tmpfiles.d/dashboard.conf"
38 | install -Dm644 "${srcdir}/dashboard.pam" "${pkgdir}/etc/pam.d/dashboard"
39 | install -Dm644 "${srcdir}/scheduled-reboot.service" "${pkgdir}/usr/lib/systemd/system/scheduled-reboot.service"
40 | install -Dm644 "${srcdir}/scheduled-reboot.timer" "${pkgdir}/usr/lib/systemd/system/scheduled-reboot.timer"
41 | }
42 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | raspi-dashboard
2 | ===============
3 |
4 |
5 |
6 |
7 |
8 | Boot a Raspberry Pi directly into a minimalistic, frameless browser.
9 |
10 | [](https://travis-ci.org/nils-werner/raspi-dashboard)
11 |
12 | This project does not include any webserver or storage to save data to be shown. The data to be shown must be accessible over the network, provided by a different device or service, for example:
13 |
14 | - [Status Board at Panic](https://www.panic.com/blog/the-panic-status-board/)
15 | - [Geckoboard](https://www.geckoboard.com/)
16 | - [Dashing](http://shopify.github.io/dashing/)
17 | - [Keen IO](https://keen.github.io/dashboards/)
18 | - [Mozaik](http://mozaik.rocks/)
19 | - [Grafana](https://grafana.com/)
20 | - [Freeboard](https://freeboard.io/)
21 | - ...
22 |
23 | Installation
24 | ------------
25 |
26 | Create the package and install it using
27 |
28 | makepkg -si
29 |
30 | Enable the dashboard using
31 |
32 | systemctl enable --now dashboard.service
33 |
34 | For peace of mind you can reboot the system every day by enabling
35 |
36 | systemctl enable --now scheduled-reboot.timer
37 |
38 | Customization
39 | -------------
40 |
41 | Edit the dashboard service
42 |
43 | systemctl edit dashboard.service
44 |
45 | and adjust the service to your liking. For example an instance with the screened turned to the right and no input devices:
46 |
47 | [Service]
48 | ExecStart=
49 | ExecStart=/usr/bin/cage -rd -- /usr/bin/luakit -U "https://duckduckgo.com/"
50 | Environment=WLR_LIBINPUT_NO_DEVICES=1
51 |
52 | Readonly filesystem
53 | -------------------
54 |
55 | To protect your SD card against wear and tear, see [`arch-overlayroot`](https://github.com/nils-werner/arch-overlayroot) for a simple overlay based readonly file system solution.
56 |
--------------------------------------------------------------------------------
/artwork/dashboard.afdesign:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nils-werner/raspi-dashboard/a9c8c2b97211e2b5954ca01b9a83df5b6e73c6e0/artwork/dashboard.afdesign
--------------------------------------------------------------------------------
/artwork/dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nils-werner/raspi-dashboard/a9c8c2b97211e2b5954ca01b9a83df5b6e73c6e0/artwork/dashboard.png
--------------------------------------------------------------------------------
/dashboard.pam:
--------------------------------------------------------------------------------
1 | auth required pam_unix.so nullok
2 | account required pam_unix.so
3 | session required pam_unix.so
4 | session required pam_systemd.so
5 |
--------------------------------------------------------------------------------
/dashboard.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Cage Wayland compositor on tty7
3 | After=systemd-user-sessions.service plymouth-quit-wait.service
4 | Before=graphical.target
5 | ConditionPathExists=/dev/tty7
6 | Wants=dbus.socket systemd-logind.service time-sync.target
7 | After=dbus.socket systemd-logind.service time-sync.target
8 | Conflicts=getty@tty7.service
9 | After=getty@tty7.service
10 |
11 | [Service]
12 | Type=simple
13 | ExecStart=/usr/bin/cage -d -- /usr/bin/luakit -U "https://www.google.com"
14 | Restart=always
15 | User=dashboard
16 | UtmpIdentifier=tty7
17 | UtmpMode=user
18 | TTYPath=/dev/tty7
19 | TTYReset=yes
20 | TTYVHangup=yes
21 | TTYVTDisallocate=yes
22 | StandardInput=tty-fail
23 |
24 | PAMName=dashboard
25 |
26 | [Install]
27 | Alias=display-manager.service
28 |
--------------------------------------------------------------------------------
/dashboard.sysusers:
--------------------------------------------------------------------------------
1 | u dashboard - "Dashboard User" /usr/lib/dashboard /bin/bash
2 | m dashboard users
3 | m dashboard video
4 |
--------------------------------------------------------------------------------
/dashboard.tmpfiles:
--------------------------------------------------------------------------------
1 | d /usr/lib/dashboard - dashboard dashboard - -
2 |
--------------------------------------------------------------------------------
/scheduled-reboot.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Hourly Reboot
3 |
4 | [Service]
5 | Type=simple
6 | ExecStart=/usr/bin/systemctl --force reboot
7 |
--------------------------------------------------------------------------------
/scheduled-reboot.timer:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Hourly Reboot
3 |
4 | [Timer]
5 | OnCalendar=*-*-* *:00:00
6 |
7 | [Install]
8 | WantedBy=timers.target
9 |
--------------------------------------------------------------------------------