No description
- C++ 98.6%
- CMake 1.2%
- Shell 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
OmniGrid is a C++20 / Qt6 (Widgets + QtWebEngineWidgets) desktop application that displays several AI chat web sessions (ChatGPT, Claude, Perplexity, Gemini, Grok, DeepSeek, Le Chat, HuggingChat, Copilot, local WebUIs, or any custom URL) simultaneously in resizable split/grid layouts. Window chrome - Frameless window (Qt::FramelessWindowHint) with a fully custom 40 px titlebar: app icon, centered workspace title, quick-add button, layout preset menu, provider-settings button, and minimize/maximize/close controls (close turns red on hover; all controls animate their hover fill via QVariantAnimation since QSS cannot transition). - Native window behaviour on the custom chrome: titlebar drag uses startSystemMove() with a manual X11 fallback, double-click toggles maximize/restore, and all eight window edges/corners resize via startSystemResize() with the proper SizeVer/SizeHor/SizeFDiag/SizeBDiag cursors. Layout engine (GridContainer) - Nested QSplitter grids with presets 1x1, 1x2, 2x1, 2x2 and an AutoFit mode; every row/column is freely resizable and flex ratios are preserved across relayouts. - Unused cells render as clickable "Add session" placeholder cards, so adding/removing tiles never forces a full relayout. Web tiles (TileWidget) - Slim 26 px header per tile: live favicon (with colored letter fallback), elided page title, and back / forward / reload / mute / unload / close buttons; target=_blank and window.open navigations are kept inside the tile. - The active tile is marked with a 1.5 px cyan accent border; unloading suspends the page (QWebEnginePage::Discarded), dims it with an overlay and any navigation wakes it again. Session and cookie isolation (ProfileManager) - Per-tile session mode: Shared (one persistent profile for all views), Isolated (persistent cookie/cache storage per tile with stable storage keys across restarts) or Private (in-memory only). - Chromium-accurate user agent, download handling to ~/Downloads. Workspace persistence (WorkspaceStore) - Open tiles, their session modes, tile ids, layout mode and splitter ratios are saved to workspace.json on quit and on every structural change; the next start restores exactly the last session and navigates each tile to its provider's home page. Configurable providers (ProviderStore + ProviderDialog) - All AI providers are user-configurable in-app (gear button / Ctrl+,): built-ins can be renamed, re-pointed or hidden; custom providers with name, URL and accent color can be added, edited and deleted. The store persists to providers.json and feeds the quick launcher. Quick launcher (QuickLauncher, Ctrl+K / Ctrl+T / "+" button) - Command-palette style modal: fuzzy filtering over all configured providers, direct URL entry, session-mode and target-tile selection, and one-click layout presets. Design system (Theme) - Charcoal/slate dark palette (#121316/#18191E backgrounds, #1E2026/#23252E surfaces, #2C2F38/#353842 borders, #38bdf8/#0ea5e9 accents) applied via app-wide QSS and QPalette; all icons are drawn programmatically with QPainter so the binary ships without asset files. Keyboard shortcuts: Ctrl+1..4 focus tile, Ctrl+T add tile, Ctrl+W close tile, Ctrl+R reload, F11 fullscreen, Ctrl+K quick launcher, Ctrl+, provider settings, Ctrl+Q quit. Build: ./build.sh (CMake >= 3.21, Qt 6.6+, C++20). Includes a desktop file for system installation and a README covering usage and data locations. |
||
| packaging | ||
| src | ||
| .gitignore | ||
| build.sh | ||
| CMakeLists.txt | ||
| README.md | ||
OmniGrid
Native multi-view AI workspace — a frameless multi-browser desktop app that shows several AI chat sessions (ChatGPT, Claude, Perplexity, Gemini, local WebUIs, …) side by side in resizable split/grid layouts.
Built with C++20 / Qt 6 (Widgets + QtWebEngineWidgets) and CMake.
Features
- Frameless window with custom titlebar (40 px): app icon, centered
workspace title, quick-add
+button, layout preset menu, and minimize / maximize / close controls (close turns red on hover, all with animated hover states). Dragging the titlebar moves the window, double-click toggles maximize, all window edges/corners resize with proper cursors. - Layout engine — nested
QSplittergrids:1×1,1×2,2×1,2×2and an auto-fit mode; every row/column is freely resizable by dragging the splitter handles (flex ratios are preserved across relayouts). - View tiles — each tile is a card with a slim 26 px header: favicon + title, back / forward / reload / mute / unload(zZ) / close buttons, and a 1.5 px cyan accent border marking the active tile. Unloading suspends the page (frees CPU) and dims it with an overlay; any navigation wakes it.
- Session & cookie isolation — per tile:
Shared(one persistent profile),Isolated(per-tile persistent cookie/cache storage) orPrivate(in-memory only). Chosen per session from the launcher. - Workspace persistence — open tiles, their session modes, the layout and
splitter ratios are saved on quit (and on every change) to
workspace.json. On the next start the same AI sessions are restored, each loading its provider's home page. Isolated profiles keep their storage keys stable, so logins survive restarts. - Configurable providers — gear button in the titlebar (or
Ctrl+,) opens the provider manager: rename/re-point/hide the built-ins and add your own (name, URL, accent color), e.g. local WebUIs. Everything is persisted toproviders.jsonand immediately available in the quick launcher. - Quick launcher (
Ctrl+K) — type to filter all configured AI services (ChatGPT, Claude, Perplexity, Gemini, Grok, DeepSeek, Le Chat, HuggingChat, Copilot, plus your own) or enter any URL; choose target tile and session mode; layout presets included. - Keyboard-first:
Ctrl+1..4focus tile,Ctrl+Tadd tile,Ctrl+Wclose tile,Ctrl+Rreload,F11fullscreen,Ctrl+,provider settings,Ctrl+Qquit.
Build
./build.sh # configure + build (Release) into build/
./build/omnigrid # run
Requirements: Qt 6.6+ with qt6-base, qt6-tools, qt6-webengine,
qt6-webchannel (on Arch: pacman -S qt6-base qt6-tools qt6-webengine),
CMake ≥ 3.21 and a C++20 compiler.
Project layout
src/
├── main.cpp app bootstrap
├── theme/ palette, dark QSS, QPainter icons, HoverButton
├── app/
│ ├── MainWindow frameless window, edge-resize, shortcuts
│ └── TitleBar custom titlebar + window controls
└── views/
├── GridContainer splitter grid engine + empty-cell placeholders
├── TileWidget web tile (slim header + QWebEngineView)
├── ProfileManager shared / isolated / private QWebEngineProfiles
├── QuickLauncher Ctrl+K command palette
└── ServiceRegistry predefined AI services
Notes
- Web session data lives under
~/.local/share/OmniGrid/OmniGrid/profiles/(shared/,isolated-tN/); workspace state inworkspace.json, provider configuration inproviders.json(same directory). Private sessions never touch the disk. - A desktop file is provided in
packaging/omnigrid.desktop. - If your desktop environment binds
Ctrl+Kglobally (some KDE setups do), use the+button orCtrl+Tto open the same launcher.