Skip to content

v1.3.1 - Menu Bar Tab Scrolling & Dark Service Pages

Choose a tag to compare

@Thuong180702 Thuong180702 released this 09 Aug 04:35
· 8 commits to main since this release

🚀 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 notihub on 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 reset scrollLeft to 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.js looks 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's persist: session partition) to a Notihub folder, 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 scrollIntoView clears 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 $HOME and confirmed no Notihub-named folder appears alongside the existing notihub one.
  • 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 notihub

Method 2: npm (CLI companion)

npm install -g @thuong180702/notihub

Method 3: DMG Installer

  1. Download notihub-v1.3.1-mac.dmg below.
  2. Double click to open the DMG, then drag notihub.app into Applications.

Method 4: Direct Zip Download

  1. Download notihub-v1.3.1-mac.zip.
  2. Unzip and move notihub.app into /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.app

Updates Notihub installs itself are never quarantined, so this is only needed for a fresh manual install.