An open-source workspace browser β all your web apps in one window.
A free, privacy-friendly alternative to Rambox. Keep Gmail, Slack, Discord, WhatsApp, Messenger, and any other web app together in one window β one click apart, each in its own isolated session.
π Download: Windows Β· macOS (Apple Silicon) Β· macOS (Intel)
Windows: run the installer. macOS: open the .dmg and drag Largs Hub into Applications. See Installation if your system warns you on first launch.
Juggling a dozen browser tabs for the apps you use all day is noisy and easy to lose. Largs Hub gives each web app a dedicated home in a single, distraction-free window β with real unread badges, isolated logins, and a native desktop feel. It's fully open source, stores everything locally, and has no account, telemetry, or subscription.
| ποΈ Unified workspace | Add any web app by URL, or pick from presets like Gmail, Slack, Discord, WhatsApp and Messenger. Reorder by drag-and-drop or Alt+β/β, and give any service a custom icon. |
| π Isolated sessions | Every service runs in its own Chromium session partition, so logins and cookies never mix. Sign in to two accounts of the same app without conflict. |
| π Real unread badges | Per-service detection (Gmail's feed, Messenger and WhatsApp page counts, and window-title counts) shows unread counts in the sidebar, on the Windows taskbar, and on the tray icon. |
| π€ Service hibernation | Optionally unload idle services to reclaim RAM. They reload on the next click and stay signed in. |
| π Link preview & find | Open a link in an in-app popup with View Link from the right-click menu, or grab it with Copy Link, and search a page with Ctrl+F. |
| π₯οΈ Native desktop feel | Back/forward/reload in the title bar, per-service zoom, remembered window size and position, native menus, and light/dark themes. Custom window buttons on Windows, native traffic lights on macOS. |
| β¨οΈ Keyboard shortcuts | Ctrl+1β9 jumps between services (hold Ctrl to see the numbers), even while a web app has focus. Ctrl is the Control key on macOS too. |
| π₯ Download handling | Choose a download folder, and optionally open the file or folder and get an alert when a download finishes, with a link that shows the file in File Explorer (Windows) or Finder (macOS). Only documents, images, audio and video open automatically; programs, scripts, installers and archives are shown in their folder instead. |
| πΆοΈ Privacy & focus | Per-service sound and notification switches, blur when inactive, and a privacy cover that hides part of a service's page. |
| π Workspace lock | Optional master password (at least 6 characters) that locks the workspace on launch, when you lock your computer, and after it has been minimized for a while. Turning it off asks for the password, and repeated wrong guesses make you wait. It's a screen lock, not encryption. |
| π§Ί Tray & startup | Close or minimize to the system tray (the menu bar on macOS), with a menu that jumps to any service, and launch at login. |
| β Todo | A daily task list that carries unfinished work forward. The Todo service is the Tasks web app, which keeps tasks on the device or in a Notion database you connect. |
| π€ Messenger automation | Optional automation panel for Messenger: scheduled and interval messages, emoji bursts, and automated in-app call cycles. It remembers each account's last settings. |
| π Report an issue | File a GitHub issue on largs-hub from the Changelog page, assigned to devlargs. The description is markdown, and a pasted screenshot is attached as an image. Needs a GitHub token in Settings. |
| β¬οΈ Auto-updates | Checks GitHub Releases, then downloads the latest version, verifies it against the sha256 checksum GitHub publishes, installs it and reopens the app, on Windows and macOS. An update with no checksum is never installed; it links to its GitHub page to download by hand. |
| π΅οΈ Private by design | No account and no telemetry. Your services and settings live in a local electron-store file, and each service's login stays in its own session on your machine. |
Easiest way β one click:
That link always gives you the newest version. It needs 64-bit Windows 10 or later. Once it downloads:
- Open the downloaded
Largs Hub Setup.exe. - If Windows shows a "Windows protected your PC" prompt, click More info β Run anyway (this appears because the app isn't code-signed yet).
- Follow the installer β that's it.
If the installer won't run: Windows marks files downloaded from the internet, and SmartScreen or your antivirus may block the installer, sometimes without showing Run anyway. Remove the mark instead, either way:
-
Right-click
Largs Hub Setup.exeβ Properties, tick Unblock at the bottom of the General tab, and click OK. -
Or run this in PowerShell, from the folder you downloaded it to:
Unblock-File -Path ".\Largs Hub Setup.exe"
Then open the installer again. You only need to do this once: in-app updates are downloaded by the app itself and install without the prompt.
Important
These warnings appear because the installer isn't code-signed, not because anything is wrong with it. They go away for everyone only once the app is signed with a code-signing certificate.
Prefer to see all versions and release notes? Browse the Releases page. The installer is Largs Hub Setup.exe (NSIS), and it keeps itself up to date in-app.
It needs macOS 13 (Ventura) or later. Pick the build for your Mac:
- Apple Silicon (M1 and later): β¬οΈ
Largs-Hub-arm64.dmg - Intel: β¬οΈ
Largs-Hub-x64.dmg
Once it downloads:
- Open the
.dmgand drag Largs Hub into Applications. - Open Largs Hub from Applications. The app isn't notarized by Apple yet, so macOS blocks it the first time. Go to System Settings β Privacy & Security, scroll down and click Open Anyway next to the Largs Hub message. (On macOS 14 and earlier you can right-click the app and choose Open instead.)
If macOS says "Largs Hub" Not Opened ("Apple could not verify 'Largs Hub' is free of malwareβ¦"), click Done, not Move to Trash. Then either use Open Anyway as in step 2, or run this once in Terminal:
xattr -dr com.apple.quarantine "/Applications/Largs Hub.app"This removes the "downloaded from the internet" flag, so the app opens normally. You only need to do this once. In-app updates download without that flag, so they won't hit this dialog again.
Important
This dialog appears because the app isn't signed and notarized by Apple, not because anything is wrong with it. It goes away for everyone only once the app is signed with an Apple Developer ID and notarized, which needs a paid Apple Developer account. Until then, use one of the steps above.
When an update is available, the app downloads it, closes, replaces the old version in Applications and reopens, the same as on Windows. If it can't replace itself (for example, it's still running from the .dmg, or you don't have permission to change the Applications folder), it opens the new .dmg instead so you can drag Largs Hub into Applications.
Linux: There is no prebuilt Linux download yet. The packaging config includes an
.AppImagetarget, so you can build it from source, but it's unofficial and untested.
- Launch Largs Hub.
- Click Add Your First Service (later, the Home button at the top of the sidebar brings you back to Add Service).
- Pick a preset, or choose Custom and enter a name and the web app's address (e.g.
https://mail.google.com), then save. - Sign in once. Your session is remembered and isolated from every other service.
Right-click a service in the sidebar for its options: enable, blur when inactive and privacy mode; a Permissions section with Notifications, Sound, Microphone and Camera; then edit, reload, clear data and remove. Microphone and Camera are separate switches. Both start on for services with calls (Messenger, WhatsApp, Slack, Discord, Telegram, Gmail and Google Chat) and off for everything else, so you can, for example, allow a service your microphone but not your camera. Either way, only the service's own pages can use them, never a sign-in page or embedded content from another site. App-wide settings are behind the gear icon in the title bar.
Report an issue (Changelog page) needs a GitHub personal access token, saved once in Settings β GitHub β GitHub token. It works the same on Windows and macOS. To create one:
- On github.com, open Settings β Developer settings β Personal access tokens β Fine-grained tokens β Generate new token.
- Set Resource owner to
devlargsand Repository access to Only select repositories β largs-hub. - Under Permissions, set Issues and Contents to Read and write. Contents is where pasted images go: GitHub's API can't attach files to an issue, so each image is committed to an
issue-imagesbranch and linked from the issue. - Paste the token into Largs Hub and click Save. It's checked with GitHub, then stored encrypted by the system (Windows DPAPI or the macOS Keychain) and only ever used by the app's main process.
Repeat for each app you want in your workspace.
- Node.js 24.21.0, exactly. It's pinned in
.nvmrc(nvm useorfnm usepicks it up) and inpackage.json'sengines, and.npmrcsetsengine-strict, sonpm installrefuses to run on any other version. CI uses the same version. - npm
- To package the macOS app: a Mac (the build ad-hoc signs the bundle with
codesign)
git clone https://github.com/devlargs/largs-hub.git
cd largs-hub
npm installnpm run devStarts the Vite dev server, the Electron TypeScript watcher, and Electron itself (with hot reload) concurrently.
| Script | Description |
|---|---|
npm run dev |
Run the app in development with hot reload |
npm run build |
Type-check and build the renderer + Electron bundles |
npm run clean:electron |
Delete dist-electron/ (build and dev do this first) |
npm run electron:build |
Build and package an installer for this OS into release/ |
npm run typecheck |
Type-check the renderer, Electron, and test projects |
npm run lint / npm run lint:fix |
Lint with ESLint |
npm run format / npm run format:check |
Format with Prettier |
npm test |
Run the Vitest unit suite |
Windows packaging note: If you hit symlink errors during
electron:build, enable Developer Mode in Settings β System β For developers.macOS packaging note:
electron:buildon a Mac produces both DMGs (Apple Silicon and Intel). Releases build the Windows installer and both DMGs in GitHub Actions (release.yml).
- Electron 44 β desktop shell with a layered
WebContentsViewarchitecture. A weekly workflow (electron-support.yml) fails once the Electron major drops out of Electron's supported window - React 19 + TypeScript β renderer UI, fully typed across main/preload/renderer
- Vite β dev server and bundler
- Tailwind CSS 4 β styling with Catppuccin-style theme variables
- Zustand β lightweight renderer state (notification counts)
- electron-store β local persistence for services and preferences
- electron-builder β packaging (NSIS installer on Windows, DMG on macOS)
- Vitest + ESLint + Prettier β testing and code quality, run in CI on every push and PR
Updates don't use electron-updater: electron/updater/ checks GitHub Releases itself and runs the installer (Windows) or swaps the app bundle in place (macOS, electron/macUpdate.ts), since neither build is code-signed.
Largs Hub is built on a three-layer WebContentsView stack hosted in a single frameless window:
- UI view β the React app (sidebar, titlebar, modals, settings), rendered transparently over the full window.
- Service views β one
WebContentsViewper enabled service, each with its ownpersist:service-<id>session partition for isolated logins. Only the active one is visible. - Overlay views β the link preview, layered on top. (Messenger calls open in their own window.)
The main process owns all persistence, native menus, notification detection (via pluggable per-service badge adapters), download handling, and the auto-updater. The renderer holds only runtime UI state and communicates through a typed IPC bridge (a handler in electron/ipc/ or electron/window/ β the preload.ts API β the src/types.ts interface). Payload types are declared once, in electron/shared/types.ts.
largs-hub/
βββ electron/ # Main process & preload
β βββ main.ts # Entry point: module wiring and app lifecycle
β βββ window/ # The window, UI layer, link-preview overlay and window IPC
β βββ preload.ts # Typed contextBridge API
β βββ serviceViews/ # Service-view creation, switching, hibernation, calls, overlays
β βββ store.ts # electron-store schema & migrations
β βββ downloads.ts # Download session handling
β βββ downloadToast.ts # Download-complete toast
β βββ updater/ # GitHub Releases auto-updater
β βββ github/ # Report an issue: token storage, issue and image upload
β βββ macUpdate.ts # In-place app replacement on macOS
β βββ notificationCounts.ts # Badge state, Windows taskbar badge
β βββ tray.ts # Tray / menu bar icon and menu
β βββ messengerAutomation/ # Messenger automation scheduler, IPC & injected scripts
β βββ badge-adapters/ # Per-service unread-count detection
β βββ ipc/ # services, settings, security & list-group IPC handlers
β βββ shared/ # Types and layout constants shared with the renderer
βββ src/ # React renderer
β βββ components/ # UI components, with per-feature folders (settings/, sidebar/, β¦)
β βββ hooks/ # React hooks, incl. the ones that mirror main-process state
β βββ lib/ # Pure renderer helpers
β βββ store/ # Zustand stores
β βββ types.ts # The window.electronAPI interface
β βββ App.tsx
β βββ index.css
βββ scripts/ # Build helpers (macOS ad-hoc signing, changelog stamping, Electron support check)
βββ test/ # Vitest unit tests
βββ assets/ # App & service icons
Contributions are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feat/your-feature) - Make your changes
- Verify locally:
npm run typecheck,npm run lint,npm run format:check, andnpm test(CI runs all four) - Commit with a descriptive message (
git commit -m "feat: add your feature") - Push and open a Pull Request
- Follow the existing style β TypeScript throughout, functional React components, Tailwind + CSS-variable theming.
- Keep the main / preload / renderer layers cleanly separated; add IPC in all three places (a main-process handler,
preload.ts,src/types.ts). - Make changes work on both Windows and macOS, or say why only one is affected.
- Keep PRs focused β one feature or fix each.
- Update
CHANGELOG.mdwith a short, user-facing note for your change, and this README when the change affects what it describes.
MIT Β© Ralph Largo


