Skip to content

Releases: joryeugene/gitbeacon

v1.2.0

21 Mar 03:46

Choose a tag to compare

Changed

  • Menu bar app event buffer raised from 100 to 500 events in memory.
  • Scroll list shows last 50 events (was 30).
  • Header counter now tracks total events since last Clear, not just the buffer size.
    The counter keeps climbing even after the 500-event buffer trims older entries.

Added

  • "Showing last 500" indicator appears when the event buffer is full.
  • README and project docs updated for v1.1.2 dedup fixes, sync behavior, and test suite.

v1.1.2

21 Mar 03:08

Choose a tag to compare

Fixed

  • Terminal-state dedup: merged/closed PRs and closed issues now log exactly once.
    New comments on a merged PR change latest_comment_url, which passed the primary
    dedup and re-logged "Merged" on every subsequent comment. A secondary dedup check
    uses a state-stable key (id|Merged, id|PR closed, etc.) so the terminal event
    fires once regardless of later thread activity.
  • just sync now also patches the installed app bundle
    (/Applications/GitBeacon.app/Contents/Resources/) so the SHA-256 check in
    installDaemonScript() sees matching content. Previously, synced scripts were
    silently reverted on the next app launch because the bundle still had the old version.

Added

  • tests/test-dedup.sh: 15 assertions across 7 test groups covering all three dedup
    tiers plus terminal-state secondary dedup. Run with bash tests/test-dedup.sh.

v1.1.0

15 Mar 16:05

Choose a tag to compare

Added

  • macOS menu bar app (GitBeaconApp/): native SwiftUI MenuBarExtra that wraps the daemon. Click the bell icon to see recent events, toggle sound, and quit. No terminal required.
    • Event log watcher using kqueue (DispatchSource) with 5-second timer fallback for file rotation
    • Daemon lifecycle management: spawn, adopt existing, health check every 10s, kill on quit
    • Single-instance guard: second launch exits immediately instead of creating duplicate menu bar icons
    • Click any event row to open the GitHub URL in the default browser
    • App icon (KingBee bee) in Finder, Spotlight, and DMG via AppIcon.icns
    • build/package-app.sh assembles a proper .app bundle with icon, Info.plist, and ad-hoc codesigning
    • build/package-dmg.sh creates a distributable DMG with drag-to-Applications install
  • justfile recipes: build-app (universal binary), package-app, package-dmg
  • CI workflow (.github/workflows/ci.yml): shellcheck lint + swift build on macos-latest
  • README: Gatekeeper "unidentified developer" right-click workaround
  • Daemon spawned with Homebrew bash 5 (not /bin/bash 3.2) to support associative arrays and -v tests used by the daemon script

v1.0.0

04 Mar 19:03

Choose a tag to compare

Changed (breaking)

  • Project renamed gh-notify → gitbeacon: CLI command (gitbeacon), config directory (~/.config/gitbeacon/), script names (gitbeacon-daemon.sh, gitbeacon-bar.sh), notifier app (gitbeacon-notifier.app), and bundle ID (com.joryeugene.gitbeacon)
  • macOS notification permission prompt now shows GitBeacon instead of GH Notifier
  • GitHub repo moved to joryeugene/gitbeacon (old URL auto-redirects)

Fixed

  • Duplicate review_requested, assign, invitation, and approval_requested events: these one-shot notifications were re-firing on every PR update because GitHub bumps updated_at on all unread thread notifications whenever the PR is touched. Dedup now uses bare notification ID (not id|updated_at) for these reason types
  • PR review notifications showing as Assigned instead of actual review state (Approved / Changes requested) — _pr_state_event() now called with no_fallback=1 for assign and comment reasons so the caller's default label is preserved when no review state is found

v0.11.1

28 Feb 16:13

Choose a tag to compare

Changed (internal)

  • Bar: extracted 9 inline ANSI escape codes into named color constants (C_GREEN, C_MAGENTA, etc.)
  • Daemon: extracted _pr_state_event() helper, deduplicating PR review logic shared by pull_request_review and author reason handlers (net -27 lines)
  • Daemon: seen-ids deduped on boot via sort -u to prevent file bloat

Fixed

  • Bar: 📬 repo invitation events now render cyan (were falling through to dim)
  • Daemon: send_notification escapes backslashes and double-quotes instead of stripping/replacing them, fixing osascript rendering of titles containing those characters

v0.11.0

28 Feb 16:13

Choose a tag to compare

Added

  • scripts/demo-scenario.sh: standalone event writer that populates a realistic 8-event backlog with a fake daemon lock, enabling demo recordings without gh auth
  • demo.tape: VHS recording script that produces assets/demo.gif (~22s animated GIF showing color-coded events arriving, stats bar, sound toggle, quit)
  • assets/demo.gif: animated terminal recording for the README

Changed

  • README hero section: replaced stale single-line text mockup (pre-v0.9.0 format) with animated GIF showing the live bar
  • just lint now includes scripts/demo-scenario.sh

v0.10.0

28 Feb 16:12

Choose a tag to compare

Fixed

  • PR notifications (merges, approvals, state changes) silently dropped after first sight of a thread. GitHub's /notifications endpoint returns mutable threads, not immutable events; the daemon now tracks id|updated_at compound keys so thread lifecycle updates register as new events.
  • Within-batch dedup collapsed distinct PR lifecycle events (e.g. approval + merge in the same poll window). Batch key now includes reason so each event type is processed independently.

Changed

  • seen-ids format migrated from bare notification ID to id|updated_at. Old-format files are auto-detected and truncated on daemon startup (old entries can never match the new format).

v0.9.1

27 Feb 05:22

Choose a tag to compare

Changed

  • [t] test notification key removed; use just notify "test" from the repo instead
  • README: add macOS notification screenshot

Changed (internal)

  • just release now creates a draft GitHub release automatically via gh release create --draft
  • .claude/ added to .gitignore

v0.9.0

27 Feb 05:22

Choose a tag to compare

Changed

  • Event log now uses 2-line format: headline (timestamp + icon + label + repo) on line 1, title indented on line 2
  • Bar shows 16 lines (8 events × 2 lines each) instead of 8 lines
  • Event count uses grep -c '^\[' instead of wc -l to avoid double-counting detail lines
  • [o] URL extraction targets tab-bearing lines (header lines only)

Fixed

  • Antifragile daemon startup
  • pull_request_review event handler
  • CI null-url edge case

v0.8.1 — GH Notifier display name + custom ObjC binary

26 Feb 05:17

Choose a tag to compare

What's new

Fixed

  • Notification prompt and System Settings entry now show GH Notifier instead of the raw executable name gh-notify-notifier
  • Icon cache flushed after build (touch, iconservicesagent, lsregister, notificationcenterui restart) so the bee icon and correct name appear immediately in the permission prompt

Changed

  • build-notifier / installer: replaced terminal-notifier repackaging with a compiled ObjC binary (scripts/gh-notify-notifier.m). No brew install terminal-notifier required. Prerequisite is now Xcode CLT (clang) + librsvg.
  • daemon/bar: send_notification and [t] handler call gh-notify-notifier directly; removed terminal-notifier and icon.png paths
  • install.sh: idempotency check verifies CFBundleDisplayName == "GH Notifier" — stale installs auto-rebuild on re-run
  • install.sh: Step 4 verify tests the custom app and opens System Settings automatically if permissions are denied
  • README: notification permissions section updated to reference GH Notifier throughout

Added

  • scripts/gh-notify-notifier.m: minimal Objective-C notification binary source (compilable via Xcode CLT, no Swift toolchain required)
  • scripts/gh-notify-notifier.plist: authored Info.plist with CFBundleDisplayName = "GH Notifier", CFBundleIdentifier = "com.joryeugene.gh-notify"

Install / upgrade

curl -fsSL https://raw.githubusercontent.com/joryeugene/gh-notify/main/install.sh | bash

Re-running the installer rebuilds the notifier app automatically.