The ‘X11’ Nightmare When Building Kiosks
Have you ever pulled an all-nighter just trying to hide a mouse cursor or disable Alt+Tab on a public information kiosk? I once spent over 6 hours “hacking” a Python script just to prevent users from closing the browser on an advertising screen. The result? As soon as someone plugged in a keyboard, all security layers crumbled.
The core issue is that X11 wasn’t designed for modern embedded devices. It’s too heavy, has loose permission management, and is incredibly difficult to configure for 24/7 stability. Just one small error in the startup script, and your Kiosk screen displays a clunky desktop interface, looking very unprofessional.
This is where Ubuntu Frame comes in as a lifesaver. Designed by Canonical based on Mir (a Wayland compositor), it strips away all redundant desktop components. Ubuntu Frame focuses on a single task: displaying your application in full-screen mode as securely as possible.
Why is Ubuntu Frame Superior to Old Solutions?
Technically, Ubuntu Frame acts as a lean middle layer between hardware and applications. Instead of struggling with graphics drivers or window management, you just throw your app in, and Frame handles the rest.
After deploying it on about 50 Raspberry Pi 4 units, I’ve identified three major advantages:
- Secure by default: Thanks to running as a Snap, applications are completely isolated (sandboxed). Users have no way to escape to the main system to fiddle with system files.
- Resource efficient: While a minimal GNOME environment consumes about 500MB – 800MB of RAM, Ubuntu Frame uses less than 100MB.
- Accurate touch support: The Wayland protocol handles multi-touch and swipe gestures much more smoothly than the outdated X11.
Step-by-Step Ubuntu Frame Installation Guide
I recommend using Ubuntu Server 22.04 LTS for long-term stability. Here is the process on a fresh server.
1. Install Ubuntu Frame via Snap
Since it is officially distributed via Snap, installation takes less than a minute:
sudo snap install ubuntu-frame
Once installed, check if the service is ready:
snap info ubuntu-frame
2. Enable the Graphical Interface
If you are working via SSH, use the following command to tell Ubuntu Frame to take control of the display:
sudo snap set ubuntu-frame daemon=true
At this point, the screen connected directly to the computer will turn dark. Don’t panic; that’s a sign that Frame is ready to receive render commands from your application.
3. Deploy a Web Kiosk with WPE WebKit
Most projects today use web apps for easy updates. The most lightweight solution is WPE WebKit – this browser has no address bar or menus, making it highly optimized for Kiosks.
sudo snap install wpe-webkit-mir-kiosk
Next, connect the browser to the Ubuntu Frame “brain” via the interface:
sudo snap connect wpe-webkit-mir-kiosk:wayland ubuntu-frame
Finally, point the browser to your desired address (e.g., the itfromzero.com blog):
sudo snap set wpe-webkit-mir-kiosk url=https://itfromzero.com
Real-world Configuration: Small but Crucial Tips
In real projects, we rarely leave the screen at default settings. You will need deeper customization to fit your hardware.
Display Rotation
If you are installing a vertical screen (Portrait) for advertising standees, edit the configuration file at: /var/snap/ubuntu-frame/current/frame.config.
# Rotate screen 90 degrees to the right
output:HDMI-A-1:rotate=90
Save the file and restart the service to apply changes:
sudo snap restart ubuntu-frame
Diagnostic Mode
When the screen doesn’t display as expected, don’t guess. Turn on Diagnostic mode to see FPS and driver parameters:
sudo snap set ubuntu-frame diagnostic-display=true
sudo snap restart ubuntu-frame
Notes for Flutter, Qt, or Electron Developers
If you aren’t using Web but are building your own app with Flutter or Qt, the process is similar. You need to package your app as a Snap and connect it to the wayland slot. A small note: always declare the environment variable WAYLAND_DISPLAY=wayland-0 so the app knows where to render.
Conclusion
Switching from X11 to Ubuntu Frame is like upgrading from an old, high-maintenance car to a fully automated electric vehicle. It helps you worry less about security or display glitches, allowing you to focus 100% on developing app features.
If you encounter errors related to Intel or AMD graphics cards during installation, feel free to leave a comment below. I’ll help troubleshoot based on the “tough cases” I’ve dealt with before.

