Embedded app shell

hex-browser - embedded app shell for native Flutter, web apps, QML, plugins, and RTSP

hex-browser is an embedded app shell for systems that need a stable, purpose-built user surface. Built on the Qt 6/QML stack, it runs multiple tabs and brings together native Flutter, web apps, QML apps, <so> plugins, and RTSP streams, so application teams can stay inside their own ecosystem instead of rebuilding embedded UI plumbing for every device.

Embedded app shellMulti-tab kiosk shellOptimized for low-RAM targetsWeb apps included
  • One application shell: Use a single shell for operator panels, local applications, service tools, remote content, and fullscreen web workflows.
  • Low-memory embedded tuning: Background web tabs can be discarded, renderer process count is capped, and Chromium low-end device flags are applied for constrained hardware.
  • Ecosystem and service: Developers stay in their own application ecosystem while VNC, watchdog integration, startup splash handling, keyboard control, popup policy, and dark mode stay in the shell.

App shell first, browser included

hex-browser is better understood as an embedded app shell and kiosk starter than as a browser wrapper. Web apps are one supported content path beside native Flutter, QML scenes, <so> plugins, and RTSP streams.

One configuration, mixed content

The same deployment can combine native Flutter, remote web applications, local QML apps, plugin-based native code, and live video feeds without switching shells.

Configuration space for field deployment

Fullscreen behavior, rotation, popup policy, persistent storage, navbar behavior, keyboard handling, screenshots, VNC, and debugging switches are configuration-driven. In combination with ttmdaemon, the surrounding configuration space grows much further.

Web-App-Darstellung im hex-browser
Web apps when needed
Integrated web engine, popups, fullscreen control
Web apps remain one supported path inside the same shell, with dynamic tabs, navigation, overlay dialogs, and kiosk-specific popup behavior.
QML apps and native plugins
QML apps and native plugins
Local or remote QML plus <so> plugins
hex-browser routes URLs to web views, QML views, RTSP streams, or native plugins loaded through <so> or file-based .so targets.
Natives Flutter Plugin im hex-browser
Native Flutter Plugin
Flutter interfaces directly in the shell
Flutter-based user interfaces run natively through a plugin behind the shell. They remain real Flutter applications and are not rendered as a classic browser tab.
RTSP- und RTSPS-Streams im hex-browser
RTSP/RTSPS streams
Live video for camera and monitoring scenarios
RTSP and RTSPS sources can be displayed as their own content paths directly inside the shell. Camera feeds, monitoring views, and media sources can be integrated into kiosk workflows in a controlled way.
Embedded-Integration und Robustheit im hex-browser mit ttmdaemon, VNC und Watchdog
Embedded integration and resilience
ttmdaemon, VNC, watchdog, reset thresholds
Teams can focus on their own code ecosystem while hex-browser handles kiosk behavior. In combination with ttmdaemon, configuration, launch behavior, recovery, and service access become broader and easier to manage.

Prepared for real operator screens

hex-browser fits environments where operators need a dedicated flow, clear state, and predictable recovery.

Industrielle Maschinensteuerung im hex-browser

Industrial machine control

Machine HMIs, line-side dashboards, alarm states, and touch-first operator screens for industrial automation.

Haus- und Gebäudeautomation im hex-browser

Home and building automation

Wall panels, energy dashboards, room control, and connected-device orchestration with a dedicated kiosk surface.

Browser-im-Browser-Workflows im hex-browser

Browser-in-browser workflows

Nested web tools, service consoles, and controlled popup flows inside a managed kiosk shell.

Feature-Screencast im hex-browser

Feature screencast

A clean stage for navigation, tab switching, plugin loading, remote access, and other browser capabilities in motion.

Built for unattended devices

The current codebase is explicitly shaped for embedded app hosting rather than general desktop browsing. Low-end Chromium flags are enabled early, operational behavior is configurable, and recovery paths are designed for long-running kiosk installations.

  • Background web tabs can be discarded to deterministically release WebEngine RAM on constrained targets.
  • Qt WebEngine is started with renderer-process limiting, low-res tiling, and low-end device mode for embedded hardware.
  • Configuration covers fullscreen, rotation, virtual keyboard, persistent web storage, screenshot paths, popup policy, and remote debugging.
  • Optional VNC service, systemd watchdog integration, reset-threshold monitoring, and the wider ttmdaemon setup simplify commissioning and field service.

Plugins and extension path

hex-browser exposes a native plugin path so teams can extend the shell for their own devices, protocols, media paths, and application models.

Plugins and extension path
Reference plugin on GitHub

The public example repository shows the HexBrowserPluginInterface entry path for native extensions and QML-backed plugin UIs.

Open example repository
Native Flutter plugin

Flutter is integrated as a native plugin behind the shell. To the application team it stays a Flutter application, not a browser app.

Plugins for your own stack

Plugins loaded through <so> let you integrate custom protocols, device control, media pipelines, or project-specific applications into the same shell.

Supported content paths

The routing layer distinguishes the main content types directly from the configured URL.

Web appshttp:// and https:// content rendered in the integrated Chromium-based web view.
QML viewsLocal file-based QML or remote <qml> URLs routed into a dedicated QML view.
Native pluginsNative plugins loaded through <so>... URLs or file-based .so paths via the hex-browser plugin interface.
RTSP streamsrtsp:// and rtsps:// sources displayed directly in kiosk tabs for live camera and monitoring use cases.

Source-mapped JSON configuration reference

This table is based on the keys that are actually wired in the current hex-browser source, not just on the sample config file. It covers startup keys, tab parsing, runtime UI, WebEngine behavior, persistence, VNC, and recovery switches.

Source basis: gui/main.qml, gui/PanelView.qml, gui/Custom*View.qml, misc.cpp, StartupLogoResolver.cpp.

Tabs and routing

These keys define which tabs exist and how hex-browser maps each configured source to a web view, QML view, native plugin, or RTSP player.

Shell, navbar, and operator tools

These keys shape the kiosk shell itself: navigation behavior, visual style, tab icons, and operator-facing buttons.

Keyboard, gestures, and input handling

These keys tune the virtual keyboard, the swipe model, and pointer behavior for touch devices.

WebEngine and per-view behavior

These top-level keys are pushed into each created view. In the current source, most of them have concrete behavior on Chromium web tabs; plugin, QML, and RTSP tabs mainly expose the same property surface for consistency.

Storage, brightness, timers, and lifecycle

These keys affect persistence, screenshots, backlight behavior, tab lifecycle, and screensaver-related timers.

Startup, system integration, and splashscreen

These keys are evaluated early or at boot-time and affect environment setup, rotation, color scheme, splash handling, and debugging.

Reload, VNC, and resilience controls

These keys control automatic refresh, remote service access, and threshold-triggered recovery behavior.