Raspberry Pi Kiosk Mode: The Complete Setup Guide
If you want a Raspberry Pi to boot straight into a full-screen browser and stay there — no desktop, no taskbar, no way for a visitor to close the window — you're looking for Raspberry Pi kiosk mode. It's the standard way to turn a cheap single-board computer and a spare TV into a dashboard, menu board, waiting-room display, or lobby sign. This guide covers the DIY Chromium autostart method step by step, the problems people usually hit a week later, and where a managed player like the one behind TVpilot's Raspberry Pi setup fits in if you'd rather not babysit the thing.
There are really two paths here. One is scripting Chromium's kiosk flag and a systemd unit yourself — free, flexible, and yours to maintain forever. The other is running an installer that handles the kiosk config, updates, and remote content management for you. Both are legitimate. This article is honest about the tradeoffs of each.
What "kiosk mode" actually means on a Pi
Kiosk mode isn't one setting — it's a stack of small decisions that add up to a screen that just works:
- Boot directly to a desktop session (or a minimal X/Wayland session) with no login prompt.
- Launch Chromium (or another browser) automatically, in full-screen, pointed at a specific URL.
- Strip the browser chrome: no address bar, no tabs, no "restore session" popups.
- Hide the mouse cursor if there's no pointer interaction.
- Recover automatically if the browser crashes, the network drops, or power blips.
- Optionally, turn the TV itself on and off on a schedule.
The first four are the easy 80%. The last two — self-healing and TV power control — are where most DIY setups quietly fall short, because they only show up as problems after the thing has been running unattended for a while.
The DIY route: Chromium autostart on Raspberry Pi OS
If you're building this yourself, here's the shape of it on a current Raspberry Pi OS with desktop (Bookworm or later, using Wayfire/labwc on Wayland, or Openbox on X11).
First, install Chromium and unclutter (to hide the cursor) if they're not already present:
sudo apt update
sudo apt install -y chromium-browser unclutter
Next, create an autostart entry. On X11 desktops this typically lives at ~/.config/autostart/kiosk.desktop or in ~/.config/lxsession/LXDE-pi/autostart; on newer Wayland sessions you'd add a line to the Wayfire/labwc autostart config instead. A minimal launch command looks like:
chromium-browser --noerrdialogs --disable-infobars --kiosk --incognito \
--autoplay-policy=no-user-gesture-required http://your-content-url
Key flags worth knowing:
--kioskremoves the browser UI and forces full-screen.--noerrdialogssuppresses crash/restore prompts that would otherwise sit on top of your content.--incognitoavoids accumulating cache and cookies across reboots.--disable-infobarshides notification bars (translation prompts, etc.).
Then disable screen blanking (via raspi-config or xset s off -dpms in the autostart script) and set the Pi to boot straight to the desktop with auto-login enabled through raspi-config. Reboot, and if everything lines up, the Pi comes up in kiosk mode on its own.
For deeper reference on boot configuration and display settings, the official Raspberry Pi documentation is the most reliable source — screen and boot options change between OS releases, so check it against whatever OS version you're running.
Common Raspberry Pi kiosk mode problems
The script above works fine on day one. The failures show up later, and they're the same handful every time:
- Chromium crashes silently. No systemd watchdog means the screen goes black and stays black until someone notices and power-cycles it.
- Network blips leave a "no internet" page on screen until the browser is manually restarted.
- OS updates change the autostart mechanism. Wayland replacing X11 as default broke a lot of
.desktop-file kiosk scripts that assumed Openbox. - The TV stays on 24/7 because nothing is driving HDMI-CEC, which wastes power and shortens panel life on cheaper displays.
- Content updates require SSH. If the display shows a local file or a hardcoded URL, changing it means plugging in a keyboard or SSHing in — awkward for a shop floor five Pis deep.
None of these are hard to fix individually. A systemd service with Restart=always solves the crash problem; a cron job can restart Chromium on a schedule; a smart plug can handle TV power. But each fix is another thing to configure and maintain across every Pi you deploy, and it adds up if you're running more than one or two screens.
Where a managed player fits in
This is the gap tools like TVpilot exist to close. On the Pi side, TVpilot's installer is a single command generated in the dashboard with a 6-character claim code — you paste it into the Pi's terminal and it configures Chromium kiosk mode, autostart on X11 or Wayland, and a systemd service with a watchdog that restarts the player within about 10 seconds if it stops responding. It also sets quiet boot and hides the cursor, so you're not scripting those flags by hand.
A few things that go beyond what a raw Chromium autostart script does out of the box:
- HDMI-CEC TV power scheduling — the player checks a schedule in the dashboard every minute and switches the TV on or to standby over HDMI-CEC, no smart plug required.
- Automatic updates — a daily check at 03:00, plus the ability to push an update or reboot a Pi remotely from the dashboard instead of walking over with a keyboard.
- Content from a browser dashboard — playlists of images, videos, web pages and PDFs, scheduling per day/time slot, and screen monitoring showing online/offline status and heartbeats, so you know a Pi went dark before a customer tells you.
Any Pi running Raspberry Pi OS with a desktop works with this setup; a Pi 4 or 5 is recommended if you're playing video rather than mostly static images.
TVpilot vs DIY: an honest comparison
| DIY Chromium autostart | TVpilot managed player | |
|---|---|---|
| Setup time | Longer, one-time scripting | One command, few minutes |
| Crash recovery | You build it (systemd unit) | Built-in watchdog, ~10s restart |
| TV power schedule | Needs a smart plug or CEC scripting | Built-in HDMI-CEC scheduling |
| Content updates | SSH or manual file edits | Web dashboard, no SSH |
| Multi-screen management | Manual, per-device | Central dashboard |
| Cost | Free (your time) | Free tier (1 screen); paid plans from €5/month |
| Self-hosted / open source | Yes, fully yours | No — hosted SaaS, not self-hostable |
If you enjoy the scripting and only need one or two signs that rarely change, DIY is genuinely fine — there's no need to pay for something you can maintain yourself in an afternoon.
When TVpilot is — and isn't — the right fit
TVpilot makes sense if you're running more than a couple of screens, want content changes to happen from a phone or laptop without touching the Pi again, or want the TV to turn itself off overnight without extra hardware. The free plan covers one screen with 500 MB of storage and no credit card, which is enough to try the setup on a single Pi before deciding anything.
It's not the right fit if you specifically want a self-hosted or open-source stack, if the Pi needs to keep playing fresh content with no internet connection at all (the player recovers automatically after an outage, but it still needs connectivity to receive updates), or if your target device is an Android TV or Fire TV Stick and you were hoping for a dedicated native app — right now those run through the browser route rather than a native client.
Getting started
If you want the DIY path, the Chromium flags and systemd unit above are enough to get a single Pi running reliably — budget an afternoon for testing reboots and network drops. If you'd rather skip straight to a working kiosk with remote content control, the Raspberry Pi signage guide walks through the one-command installer, and you can try it on a single screen for free from the signup page before deciding whether it's worth paying for more screens.
Either way, the fundamentals are the same: full-screen browser, no chrome, automatic recovery, and a plan for updating content without unplugging anything. Build it yourself if you like the control, or use a managed player if you'd rather spend that afternoon on something else — sign up and claim your first Pi in a few minutes if you want to see which one you prefer.
Frequently asked questions
What Chromium flag actually enables kiosk mode on Raspberry Pi?
The `--kiosk` flag removes the browser's address bar, tabs, and window controls and forces full-screen. Pair it with `--noerrdialogs` and `--disable-infobars` to suppress crash-restore prompts and notification bars that would otherwise appear on top of your content.
Why does my Raspberry Pi kiosk go black after a few days?
Usually Chromium has crashed or hung and nothing is set up to restart it. A DIY fix is a systemd service with `Restart=always` watching the browser process. Managed players like TVpilot include this as a built-in watchdog that restarts the player automatically if it stops responding, typically within about 10 seconds.
Can I turn the TV on and off automatically with a Raspberry Pi kiosk?
Yes, if the TV supports HDMI-CEC. You can script CEC commands yourself and trigger them with cron, or use a player that includes scheduled CEC power control out of the box, such as TVpilot's Pi player, which checks a power schedule from the dashboard every minute and switches the TV on or to standby without needing a smart plug.
Does a Raspberry Pi kiosk need a constant internet connection?
It depends on your content. A kiosk showing a local file or cached page can run offline indefinitely. If content is pulled from a web dashboard or remote feed, the Pi needs connectivity to receive updates — though a well-built player should recover automatically once the connection returns, rather than requiring a manual restart.
