Procedure is a native, independent desktop client for Linux systems, specifically designed to integrate with the GNOME desktop environment following the GNOME HIG (Human Interface Guidelines). It acts as a minimal, fast, and secure wrapper for the Notion web service, offering a lightweight alternative to Electron focused on data privacy.
The application is identified on the system by the App ID: io.github.albeph.Procedure.
- Native GTK4 & Libadwaita Integration: Developed in Python and native GNOME system libraries to guarantee smooth animations, responsive layouts, and a visual appearance consistent with the host system.
- WebKitGTK 6.0 Engine: Uses the native system rendering engine instead of Chromium/Electron, drastically reducing RAM and CPU utilization.
- Multi-Tab Navigation:
- Advanced tab management using native top bars (
Adw.TabBarandAdw.TabView). - Open new tabs by duplicating the current URL using the
+button or keyboard shortcuts. - Independent navigation history (Back/Forward) for each tab.
- Advanced tab management using native top bars (
- Advanced "Zero-Footprint" Security on Disk:
- GNOME Keyring (
libsecret): Session cookies are never written in cleartext or encrypted on the hard drive. They reside solely in the WebKit RAM memory and are directly synchronized with the system's secure keyring. - RAM-disk Cache (
tmpfs): Local temporary databases (IndexedDB, LocalStorage) are stored in the volatile folder/run/user/<UID>/procedure/, loaded entirely in a RAM-disk. - Secure Shredding: Upon exiting the app or logging out, all volatile data is overwritten with zero bytes (
\x00) before physical deletion to prevent forensic data recovery. - Strict Permissions: Local configuration folders are locked with
0700permissions (exclusive access to the owner).
- GNOME Keyring (
- Automatic Theme Synchronization: Detects GNOME color scheme preference changes (Light/Dark) via
Adw.StyleManagerand dynamically injects CSS and JavaScript to force the matching theme inside the Notion web page. - Custom Icon Selection: Allows changing the default geometric "P" icon by loading any local PNG file from the user interface. The application will resize the image to
512x512pixels and place it in the standard user icon path. - Quick Keyboard Shortcuts:
Ctrl + T: New tabCtrl + W: Close active tabCtrl + Tab: Next tabCtrl + Shift + Tab: Previous tabCtrl + RorF5: Reload active page
Procedure implements a strict logical and technical separation to protect both your account integrity and the confidentiality of your personal data:
- Goal: Prevent the theft of session keys and subsequent hijacking of your Notion account on other devices.
- Solution: Sensitive authentication cookies (e.g.,
token_v2) have theHttpOnlysecurity flag and never touch the hard drive in cleartext. They are stored solely in GNOME Keyring, encrypted natively with the AES algorithm and protected by your Linux user password. - Sandbox Isolation: Thanks to the Flatpak sandbox integration, the keyring isolates credentials: only the Procedure application (
io.github.albeph.Procedure) is authorized by the operating system to read the cookie, while external processes will receive an empty value (None).
- Goal: Prevent unauthorized reading of your private documents, personal attachments, and search history when the computer is turned off or through forensic analysis of the storage drive.
- Solution: Notion downloads note contents locally to speed up loading (in IndexedDB/LocalStorage databases). Since web engines do not encrypt this cache at runtime, Procedure redirects it entirely into volatile RAM (
tmpfsin/run/user/<UID>/). - Secure Shredding: Upon exiting the application (or clicking "Exit"), all cache files inside the volatile RAM are overwritten with zero bytes (
\x00) before being deleted, preventing recovery of free RAM sectors (Cold-boot attacks).
Note
Because the WebKitGTK engine presents a default Safari-based User Agent string to web servers, some identity providers (such as Google OAuth or Notion's active session manager) may mistakenly identify your active login session as a macOS or Safari client instead of Linux. This is normal behavior for WebKit-based desktop wrappers on Linux and does not affect any functionality.
Once the compiled packages are generated (located in the dist/ directory), you can install and run them on your system using one of the following methods depending on the package type:
Installs the application system-wide, integrates with the desktop environment launcher, and automatically configures native dependencies.
# Install the package (run from the repository root)
sudo apt install io.github.albeph.procedure_*_all.deb
# Run the application (carch it in GNOME desktop menu or run in terminal)
procedure
# Uninstall the package
sudo apt remove io.github.albeph.procedureRuns the application inside an isolated secure container, with limited filesystem access but native GNOME Keyring sharing.
# Install the package (at user level)
flatpak install --user io.github.albeph.Procedure_*.flatpak
# Run the application
flatpak run io.github.albeph.Procedure
# Uninstall the package
flatpak uninstall --user io.github.albeph.ProcedureA single self-contained executable that packages all dependencies and runs on any modern Linux distribution without installation.
# Make the file executable
chmod +x io.github.albeph.Procedure_*-x86_64.AppImage
# Run the application
io.github.albeph.Procedure_*-x86_64.AppImageThe project is divided into isolated folders to separate application code from packaging utilities:
Procedure/
├── app/ # Application source code and resources
│ ├── procedure # Bootstrap launcher script (handles sandbox and icon paths)
│ ├── install.sh # Script to install the app natively on the host system
│ ├── io.github.albeph.Procedure.desktop # Desktop entry file for the application menu
│ ├── resources/ # Default icons and static resources
│ └── src/ # Python source modules
│ ├── main.py # Entry-point (GApplication)
│ ├── window.py # Main UI window and tab logic
│ ├── session_manager.py# Security management (Keyring, RAM-disk, Shredding)
│ ├── dialogs.py # Native dialog windows (About, icon selection)
│ └── config.py # Global client constants
│
├── packaging/ # Package recipes and build scripts
│ ├── flatpak/ # Flatpak manifest and build scripts (GNOME 50)
│ ├── appimage/ # AppImage recipe and portable build scripts
│ └── deb/ # Debian package script and metadata
│
├── dist/ # Generated binary targets ready for distribution
│ ├── io.github.albeph.Procedure.flatpak # Standalone portable Flatpak bundle
│ ├── io.github.albeph.Procedure-x86_64.AppImage # Standalone portable AppImage binary
│ └── io.github.albeph.procedure_*.deb # Debian installer package
│
├── README.md # This file (project overview)
└── MANUAL.md # Detailed user and developer manual
Make sure you have installed GTK4 and WebKitGTK dependencies on your Linux system. On Debian/Ubuntu-based distributions:
sudo apt install python3 python3-gi python3-pil libadwaita-1-dev gir1.2-webkit-6.0 gir1.2-adw-1You can run the application in development mode directly using the launcher:
./app/procedure./app/procedure --verboseIf you wish to compile Flatpak, AppImage, or Debian (.deb) packages ready to be installed or distributed on other Linux machines, refer to the detailed guide:
👉 packaging/README.md