v1.3.1 - Menu Bar Tab Scrolling & Dark Service Pages
🚀 Notihub v1.3.1
Release Title: v1.3.1 - Menu Bar Tab Scrolling & Dark Service Pages
🌟 Highlights
↔️ Menu Bar Panel tabs are actually reachable now. In the compact 420px panel, a tab strip past the 3rd or 4th service was pushed off the edge with no way to scroll to it — the strip laid itself out at full content width instead of shrinking to fit. Drag or scroll horizontally to reach the rest.- 🌗 Dark service pages, not just dark chrome. Switching Notihub to Dark used to darken only the tab bar and Settings — a site with no dark theme of its own (a Slack sign-in screen, for example) stayed a white rectangle inside a dark window. New Dark Service Pages toggle in Settings → Appearance (on by default) darkens those too, while leaving a site's real dark theme (Gmail, the Slack app) alone.
- ✏️ The app is "Notihub" everywhere you read it — window title, tray, menu bar, notifications, docs. The CLI command, bundle file, and config folder stay lowercase
notihubon purpose (see below).
🛠️ Detailed Changelog
↔️ Tab strip scrolling in Menu Bar mode
.tabs-container used flex: 0 1 auto, so it sized itself to its content and only then discovered there wasn't room — pushing the Settings button off-panel instead of triggering overflow-x: auto. Fixed with flex: 1 1 0; min-width: 0, plus the scrolling actually needed to be usable:
- Drag-to-pan with a 5px threshold, so a plain click on a tab still switches to it.
- Mouse wheel scroll (a wheel has no horizontal axis on its own).
- Scroll position now survives a re-render —
renderTabs()fires on every badge change and once a minute from the watchdog, and used to resetscrollLeftto 0 each time. - The active tab scrolls into view on an actual tab switch (Cmd+1…9, Control+Tab, tray) — not on every badge tick, so it doesn't yank the strip while you're mid-scroll.
- A soft edge fade hints when more tabs are scrolled out of sight, since the scrollbar itself stays hidden.
🌗 Dark Service Pages
Setting Notihub to Dark only ever told pages prefers-color-scheme: dark — a site that ignores that query, or has no dark theme at all, stayed white. Each service view now gets Chromium's own auto-dark-mode override applied over CDP (Emulation.setAutoDarkModeOverride) whenever the app is dark, re-applied on every navigation since a cross-site load can swap the renderer process out from under it. Chromium skips pages that already declare color-scheme support, so a site with a real dark theme keeps it instead of being inverted twice. New toggle in Settings → Appearance, on by default.
✏️ App name: Notihub in the UI, notihub on disk
The name shown to the user — window title, tray tooltip, menu bar, notifications — is now Notihub, set via app.setName(). Two things were deliberately not renamed, because other code depends on the lowercase spelling:
notihub.app, the bundle file name —src/updater.jslooks for exactly that name inside a downloaded release zip. Renaming it would have broken self-update for every already-installed copy.~/Library/Application Support/notihub, the data directory —app.setName()would otherwise have moved Electron's userData (and every service'spersist:session partition) to aNotihubfolder, signing everyone out on upgrade.app.setPath('userData', …)pins it back to where the data already lives.
✅ How this was verified
- Tab strip: driven headlessly in a 420×200 harness at the real Menu Bar panel width — confirmed the Settings button stays in-panel, wheel/drag/click and scroll-position-across-rerender all behave, and a tab revealed by
scrollIntoViewclears the edge fade. - Dark Service Pages: a plain white test page under real Electron went from average luma 252 → 21 with the override enabled, back to 252 with it cleared.
- App name / userData: launched against a throwaway
$HOMEand confirmed noNotihub-named folder appears alongside the existingnotihubone. npm test: all 54 existing unit tests still pass unchanged.
📦 Download Assets & Checksums
| Asset File | Format | SHA-256 Checksum |
|---|---|---|
notihub-v1.3.1-mac.dmg |
Native macOS DMG Installer | e57d512e52d8ffaf47832fd3dda582c9a0b3e4af9db7061a842f11d01dae8214 |
notihub-v1.3.1-mac.zip |
Portable Zip Archive | 58faec7398b77ebfc226db6795ef2cba9cc433b0deea31626de9b06b6be158b7 |
These match what GitHub publishes as the digest field on each asset — the same value src/updater.js verifies the download against before installing.
📥 Installation Options
Method 1: Homebrew (Recommended)
brew tap thuong180702/notihub
brew install --cask notihubMethod 2: npm (CLI companion)
npm install -g @thuong180702/notihubMethod 3: DMG Installer
- Download
notihub-v1.3.1-mac.dmgbelow. - Double click to open the DMG, then drag
notihub.appintoApplications.
Method 4: Direct Zip Download
- Download
notihub-v1.3.1-mac.zip. - Unzip and move
notihub.appinto/Applications.
⬆️ Upgrading from v1.3.0
Use Settings → Download & Install — this release ships the same self-update path introduced in v1.3.0. No bundle identifier or data-directory change, so logins and notification permissions stay intact.
⚠️ Gatekeeper Notice
Notihub is signed ad-hoc, not notarized by Apple, so macOS will refuse a manual install with "notihub is damaged and can't be opened". This isn't corruption — it's Gatekeeper rejecting an unnotarized app. Clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/notihub.appUpdates Notihub installs itself are never quarantined, so this is only needed for a fresh manual install.