Web App Container
A lightweight, persistent web container built with C++20 and Qt 6.11. The application uses a Qt Quick/QML interface with Qt WebEngine and allows web applications to run as standalone desktop apps with isolated profiles, custom icons, downloads, and system tray integration.
β¨ Features
- Isolated Profiles: Each instance can have its own cookies, storage, and cache using the
--profileflag. - Persistent Permissions: Camera and Microphone grants are remembered per-domain in a local
settings.ini. - Push Notifications: Full support for web push notifications with click actions, custom icons, and notification badges.
- Custom Branding: Set the window title, taskbar icon, and tray icon dynamically via command-line arguments.
- System Tray Integration: Start minimized or hide the app to the tray to keep your workspace clean.
- Linux Optimized: Supports
app-id(Wayland) andWM_CLASS(X11) for correct taskbar grouping.
π Getting Started
Prerequisites
- Qt 6.11 (Core, Gui, Qml, Quick, Quick Controls, WebEngineQuick, WebEngineCore, Widgets, DBus, and Network)
- CMake 3.16+
- C++20 compliant compiler (GCC/Clang)
Packages
Arch/Manjaro/Endeavour OS/Garuda/CachyOS
The app is available on the XLibre Arch repository
# Add the GPG Key
curl -sS https://x11libre.net/repo/arch_based/x86_64/0x73580DE2EDDFA6D6.gpg | sudo pacman-key --add -# Locally Sign the Key
sudo pacman-key --lsign-key 73580DE2EDDFA6D6Edit your pacman configuration file (usually found at /etc/pacman.conf) using a text editor like nano or vim
# Configure the repository
sudo nano /etc/pacman.confAdd the following at the end of the file:
[xlibre]
Server = https://x11libre.net/repo/arch_based/$arch/# Update your package database and install the webappcontainer package
sudo pacman -Sy webappcontaineror it is available on the AUR so you can use your preferred AUR installer
yay -S webappcontainerArtix
The package is available in the galaxy repository:
sudo pacman -S webappcontainerBuilding from Source
# Clone the repository
git clone https://github.com/josephcrowell/webappcontainer.git
cd webappcontainer
# Configure and build the default QML frontend
cmake -S . -B build
cmake --build build -j
# Run the test suite
ctest --test-dir build --output-on-failureDRM/Widevine Support
Automatic Download (Default)
The build system automatically downloads Widevine CDM from Google's Chrome component repository or finds the one installed by your distribution. No Chrome installation needed!
cmake -S . -B build # Widevine is enabled by default
cmake --build build -jDisable Widevine
To build without Widevine support:
cmake -S . -B build -DENABLE_WIDEVINE=OFFUpdate Widevine
To update to the latest Widevine version:
# From the build directory
make update-widevineNotes
- Widevine is downloaded as a Chrome component (CRX3 format) without requiring Chrome/Chromium installation
- Only Linux x86_64 is currently supported for automatic download
- The Widevine CDM enables DRM-protected content playback (Netflix, Spotify, etc.)
DRM Status
When enabled, the application downloads or discovers a Widevine CDM and passes its library path to Chromium before WebEngine initialization. CDM discovery, Encrypted Media Extensions availability, key-system access, codec support, and successful encrypted playback are separate capabilities.
Verification:
# Check that Widevine is enabled
./webappcontainer --url "https://open.spotify.com" 2>&1 | grep Widevine
# Expected diagnostic: "Widevine CDM enabled"Requirements:
- Qt WebEngine must be built with proprietary codecs (default on most distributions)
- A compatible Widevine CDM (downloaded during supported Linux x86_64 builds)
π Usage
Run the executable followed by your desired configuration:
webappcontainer [options]Command Line Arguments
| Option | Description |
|---|---|
-u, --url <url> | The initial URL to open (e.g., https://web.whatsapp.com or web.whatsapp.com). |
-a, --app-id <id> | Unique ID (e.g., com.user.app) for Linux taskbar grouping. |
-p, --profile <name> | Name of the profile folder (stores cookies and settings). |
-n, --name <name> | The display name for the window and tray tooltip. |
-i, --icon <path> | Path to a PNG/SVG for the window/taskbar icon. |
-t, --tray-icon <path> | Path to a PNG/SVG for the system tray icon. |
--minimized | Start the application hidden in the system tray. |
--no-notify | Don't notify when minimizing or closing to the tray. |
-h, --help | Display help information and exit. |
Example
To launch a dedicated Discord container:
webappcontainer --name "Discord" --url "https://discord.com/app" --profile "chat" --icon "./icons/discord.png" --app-id "com.joseph.discord"π Directory Structure
Files are stored in your user's local data directory (e.g., ~/.local/share/JosephCrowell/<app_name or "Web App Container">/):
QtWebEngine/<profile_name>/settings.ini: Stores window geometry and site permissions.QtWebEngine/<profile_name>/Network/: Stores persistent cookies.QtWebEngine/<profile_name>/cache/: Stores temporary web data.
π Push Notifications & Web Push API
The application provides full support for both basic notifications and the Web Push API with service workers
This project is licensed under the GPL-2.0-or-later
SPDX-License-Identifier: GPL-2.0-or-later
Copyright (C) 2026 Joseph Crowell