Running the visa business meant living in four browser tabs, the WordPress admin where Fluent Forms collects applications, the visa status page where progress gets updated, the Tawk.to dashboard where customers chat, and the webmail where the office address lives. Four logins, four tabs to lose among thirty others, and every context switch an invitation to miss a message. The fix became its own project, a desktop application that wraps all four into one window, and this post is the idea and the architecture decision it stood on.
The requirements wrote themselves from the daily friction. One window, four sections, switchable in a click. Sessions that persist, log in once, stay logged in across tabs and restarts. The real tools themselves, not imitations, because the WordPress admin and the Tawk.to inbox are living web applications that would be madness to rebuild. And a professional look, this app would run all day on the business’s machine, it should feel like a product, not a script.
Those requirements picked the architecture almost by themselves, a desktop shell embedding real browser views. Python for the language I build fastest in, PyQt5 for a mature desktop framework with proper styling, and its QWebEngineView component, a full Chromium browser engine that lives inside a widget, one embedded browser per section:
from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView
# the shape of the whole app:
# MainWindow
# sidebar navigation (four buttons)
# QStackedWidget holding four QWebEngineView pages,
# one per service, switched by the sidebar
The alternative architectures lost on contact with the requirements. Rebuilding the tools natively, months of work to imitate systems that already exist and change under me. Browser bookmarks or a pinned window, exactly the tab-chaos being escaped. A wrapper like this is sometimes dismissed as just a browser with fewer features, and that dismissal misses what it adds, curation and state, only these four tools, always logged in, always one click apart, plus a place to hang real features the browser never offers, which the password manager post later in this series delivers. The plan set, four posts follow it through, embedding the browser, sharing the sessions, unifying the services, and packaging the result like a real product.
A few things people ask me about this
Why not just use a dedicated browser profile with four pinned tabs? It solves adjacency and nothing else, no unified design, no native features like a managed password store, and the tabs still drown among the day’s other browsing. The cockpit is the difference between a workspace and a bookmark folder.
Why PyQt5 over building an Electron app? Familiarity and weight, Python is my fastest language and PyQt ships the browser engine without shipping a Node stack. Electron is the same idea from the JavaScript side, the architecture, embedded Chromium in a desktop shell, is identical.
Next
The first technical step is making a web page live inside a desktop window at all. Embedding Chromium with QWebEngineView, and its install quirks, is the next post.
