Pulse Display Assistant is a Raspberry Pi kiosk OS purpose-built for Home Assistant dashboards. Each device self-provisions a hardened Chromium display with watchdogs, schedule-aware backlighting, and MQTT telemetry/control. A live overlay surfaces internal timers, alarms, reminders, now-playing info, plus on-demand news, weather, and sports snapshots—with clickable notification badges that stay synced to the backend schedule service. An optional Wyoming voice stack adds wake-word control, STT/TTS, and multi-turn conversations, while the LLM layer can hot-swap between OpenAI and Google Gemini so follow-up questions and automations route through whichever model you prefer, all without leaving the Pulse display.
What Pulse can do today
- Hardened Chromium kiosk with watchdogs, self-healing restarts, and MQTT “home/update/reboot” buttons targeted at photo-frame style Lovelace dashboards.
- Overlay timeline that keeps alarms, timers, reminders, calendar events, now-playing info, and badge-driven info cards in sync with the backend scheduler.
- Full alarm/timer/reminder scheduler (manual UI, MQTT, or voice shortcuts) plus remote completion/delay actions from the overlay itself.
- Local ICS/WebCal polling with multi-
VALARMsupport, “declined” attendee detection, on-screen calendar cards, and auto-suppressed pop-ups for meetings you said “No” to. - Optional Wyoming voice stack (wake word, Whisper STT, Piper TTS) with shortcut intents for news/weather/sports and LLM routing between OpenAI and Gemini.
- MQTT telemetry, syslog streaming, and safe-reboot guardrails for remote monitoring, plus built-in OTA-style updates triggered from Home Assistant.
- Sunrise/sunset-aware backlight control, Bluetooth autoconnect for external speakers, and one-touch audio tests to confirm volume changes.
- Printable hardware accessories (mic stand, speaker cups, Pi 5 case) and ready-made scripts for kiosk recovery, calendar snapshots, and service restarts.
- home-assistant-photo-frame — Nest-style Lovelace photo frame + custom card
- mqtt-and-telemetry — MQTT buttons (Home/Update/Reboot) & diagnostic sensors
- voice-assistant — Wyoming pipelines, LLM providers, and real-time news/weather/sports intents
- assistant-commands — Built-in “no LLM needed” voice shortcuts (alarms, timers, news, etc.)
- troubleshooting — Pi 5 + Touch Display kiosk fixes (black strip, touch, autologin, etc.)
- notes-and-extras — Voice assistant tips, MQTT knobs, hardware accessories, boot splash notes, and other odds & ends
- public-photo-sources — Open-licensed image feeds (NASA, Smithsonian, Met, etc.) for
pulse-photo-card - config-reference — Comprehensive
pulse.confoption list with defaults and usage notes
Supported hardware, recommended parts, and printable accessories
As of Nov 2025, $317 plus 3d printed parts (or buy/figure out a case) to build a single Pulse. Or choose your own components - anything that will work with Linux.
- Specs: https://www.raspberrypi.com/products/raspberry-pi-5/
- Retailer: https://www.pishop.us/product/raspberry-pi-5-16gb/?src=raspberrypi
- Recommended add-ons:
- Price (11/2025): $131 with active cooler
- Specs: https://www.raspberrypi.com/products/touch-display-2/
- Retailer: https://www.pishop.us/product/raspberry-pi-touch-display-2/
- Price (11/2025): $82
- Specs: https://wiki.seeedstudio.com/respeaker_mic_array_v3.0/
- Retailer: https://www.seeedstudio.com/ReSpeaker-Mic-Array-v3-0.html
- Price (11/2025): $64
- Specs: https://boompodsusa.com/products/boompods-zero-mini-wireless-bluetooth-5-pocket-size-speaker
- Retailer: same
- Price (11/2025): $40
- ReSpeaker Mic Array Plate (which I glue to the Pi case cover)
- ReSpeaker Mic Array Cover
- BoomPod Zero Cup (which I glue to one of the display leg stands - or both for two pods!)
- Raspberry Pi 5/CM4/CM5 with Raspberry Pi Touch Display 2 (DSI ribbon in the “closer” socket).
- Fresh Raspberry Pi OS Lite (64-bit) (Trixie, at the moment) written to microSD - I'm using 128GB but it's only 20% full (so far).
- Setup "pulse-" hostname and "pulse" user when imaging OS
- Can also pre-setup networking, make sure SSH is on, enable auto-login
- Network connectivity (Ethernet or Wi‑Fi).
- SSH access (run
sudo raspi-config nonint do_ssh 0or enable via imager advanced options).
-
Update Raspberry Pi OS and install prerequisites.
sudo apt update && sudo apt full-upgrade -y sudo apt install -y git gh neovim sudo chown pulse:pulse /opt -
Clone PulseOS under
/optand open the repo.cd /opt git clone https://github.com/weirdtangent/pulse-os.git cd pulse-os
-
Create
pulse.conffrom the sample and edit it for this kiosk.cp pulse.conf.sample pulse.conf vi pulse.conf
-
Create a Pulse dashboard in Home Assistant (recommended).
- From the HA sidebar, add a new dashboard named “Pulse” using the dashboard URL slug
dashboard-pulse. - For the first tab/view, set the title to “Home” with the view URL slug
homeand add the Lovelace cards you want displayed. - Pulse defaults to
http://homeassistant.local:8123/dashboard-pulse/home, so tweak the hostname if needed or pointPULSE_URLelsewhere in the next step.
- From the HA sidebar, add a new dashboard named “Pulse” using the dashboard URL slug
-
Run the setup script with a location slug (first boot only).
./setup.sh <location-name>
By default
setup.shfinishes by callingbin/tools/restart-services.shso every kiosk service reloads without a reboot. Pass--no-restartif you’re iterating on a single unit and want to restart things manually (you can always run the helper script yourself later).Re-run
./setup.shafter changingpulse.confor pulling new code (omit the location on repeat runs). The MQTT “Update” button performs the same update + setup flow remotely and inherits the automatic restart step.
Each kiosk reads /opt/pulse-os/pulse.conf. Copy the sample, edit the values that matter for this device, then rerun ./setup.sh.
cp /opt/pulse-os/pulse.conf.sample /opt/pulse-os/pulse.conf
vi /opt/pulse-os/pulse.confAll keys are optional, but filling out the relevant sections keeps boot, kiosk, MQTT, and assistant services aligned with your environment. Refer to docs/config-reference.md for every available variable, its default, and practical usage notes.
🔒 Security tip:
pulse.confoften contains API keys, MQTT credentials, and private calendar URLs.setup.shautomatically sets the file owner toPULSE_USERand applieschmod 600, but keep the repo staged under/opt(not your home directory) and never commitpulse.confback to git or copy it into cloud backups without similar protections.
After editing pulse.conf, run the connectivity check to confirm the services you referenced are reachable:
bin/tools/verify-conf.py --config /opt/pulse-os/pulse.confIt loads the config (or the path you pass with --config) and:
- Connects to the MQTT broker using your credentials.
- Sends a single RFC5424 syslog line if remote logging is enabled.
- Calls each configured Wyoming endpoint (openWakeWord/Whisper/Piper) and, when possible, performs a short functional probe.
- Tests
HOME_ASSISTANT_BASE_URL/HOME_ASSISTANT_TOKENby calling/api/.
Any failure is printed with remediation text and the script exits non-zero so you can gate deployments on it if desired.
All of the voice-assistant tips, MQTT knobs, Home Assistant snippets, printable accessories, and boot splash notes now live in docs/notes-and-extras.md. Looking for the built-in wake-word shortcuts? See docs/assistant-commands.md.
See the dedicated troubleshooting guide for the full Pi 5 + Touch Display checklist (black strip, touch calibration, autologin, etc.). Buy Me A Coffee
