Skip to content

Latest commit

Β 

History

424 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Largs Hub

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.

Latest release Downloads License: MIT Platform Platform Built with Electron

πŸ‘‰ 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.

Largs Hub main window
More screenshots Multiple services Settings Add service

Why Largs Hub?

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.

Features

πŸ—‚οΈ 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.

Installation

Download (Windows)

Easiest way β€” one click:

That link always gives you the newest version. It needs 64-bit Windows 10 or later. Once it downloads:

  1. Open the downloaded Largs Hub Setup.exe.
  2. If Windows shows a "Windows protected your PC" prompt, click More info β†’ Run anyway (this appears because the app isn't code-signed yet).
  3. 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.

Download (macOS)

It needs macOS 13 (Ventura) or later. Pick the build for your Mac:

Once it downloads:

  1. Open the .dmg and drag Largs Hub into Applications.
  2. 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 .AppImage target, so you can build it from source, but it's unofficial and untested.

Getting Started

  1. Launch Largs Hub.
  2. Click Add Your First Service (later, the Home button at the top of the sidebar brings you back to Add Service).
  3. Pick a preset, or choose Custom and enter a name and the web app's address (e.g. https://mail.google.com), then save.
  4. 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:

  1. On github.com, open Settings β†’ Developer settings β†’ Personal access tokens β†’ Fine-grained tokens β†’ Generate new token.
  2. Set Resource owner to devlargs and Repository access to Only select repositories β†’ largs-hub.
  3. 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-images branch and linked from the issue.
  4. 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.

Development

Prerequisites

  • Node.js 24.21.0, exactly. It's pinned in .nvmrc (nvm use or fnm use picks it up) and in package.json's engines, and .npmrc sets engine-strict, so npm install refuses 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)

Setup

git clone https://github.com/devlargs/largs-hub.git
cd largs-hub
npm install

Run in development

npm run dev

Starts the Vite dev server, the Electron TypeScript watcher, and Electron itself (with hot reload) concurrently.

Common scripts

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:build on a Mac produces both DMGs (Apple Silicon and Intel). Releases build the Windows installer and both DMGs in GitHub Actions (release.yml).

Tech Stack

  • Electron 44 β€” desktop shell with a layered WebContentsView architecture. 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.

Architecture

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 WebContentsView per enabled service, each with its own persist: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

Contributing

Contributions are welcome!

  1. Fork the repository
  2. Create a feature branch (git checkout -b feat/your-feature)
  3. Make your changes
  4. Verify locally: npm run typecheck, npm run lint, npm run format:check, and npm test (CI runs all four)
  5. Commit with a descriptive message (git commit -m "feat: add your feature")
  6. Push and open a Pull Request

Guidelines

  • 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.md with a short, user-facing note for your change, and this README when the change affects what it describes.

License

MIT Β© Ralph Largo

About

Open source Rambox/Station/Wavebox alternative built with Electron + React. My Personal Social Workstation

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages