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 --profile flag.
  • 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) and WM_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 73580DE2EDDFA6D6

Edit 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.conf

Add 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 webappcontainer
or it is available on the AUR so you can use your preferred AUR installer
yay -S webappcontainer

Artix

The package is available in the galaxy repository:

sudo pacman -S webappcontainer

Building 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-failure

DRM/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 -j

Disable Widevine

To build without Widevine support:

cmake -S . -B build -DENABLE_WIDEVINE=OFF

Update Widevine

To update to the latest Widevine version:

# From the build directory
make update-widevine

Notes

  • 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

OptionDescription
-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.
--minimizedStart the application hidden in the system tray.
--no-notifyDon't notify when minimizing or closing to the tray.
-h, --helpDisplay 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