Repository navigation
Releases: SteveZouWonder/dev-notifier
Release list
Dev Notifier 2.0.0
Menu-bar / tray notifier for Jira, GitHub & PagerDuty (macOS + Windows).
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS (Apple Silicon) | DevNotifier-2.0.0.dmg |
Open, drag into Applications, then see the note below |
| Windows | DevNotifier-2.0.0-setup.exe |
Run the installer (per-user; SmartScreen: More info -> Run anyway) |
| Windows (portable) | DevNotifier-2.0.0-portable.exe |
Just run it |
Verify file integrity via the attached
SHA256SUMS.txt(the in-app updater does this automatically).
macOS note (first launch and after every update)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized and macOS blocks it with "is damaged and can't be
opened". Clear the quarantine flag once in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
or use System Settings -> Privacy & Security -> Open Anyway after the
first attempt. (On macOS 14 and earlier, right-click -> Open also works.)
What's changed
Added
- PagerDuty on-call shift reminders: a heads-up before your shift starts (default 1 day and 1 hour before,
pagerduty.oncall_remind_before_minutes), when it starts, and when it ends (silent), sourced from/oncalls. Turn off withpagerduty.oncall_reminders: false - a PagerDuty ▸ menu (when enabled) showing whether you are on-call right now and until when (or when your next shift starts), and the open incidents assigned to you — click one to open it. The Status line also shows
· on-call - PagerDuty now notifies when an incident is escalated or reassigned to you, when someone requests you as a responder, when a note mentions you, and on notes, priority/urgency changes, snoozes, ack timeouts and exhausted escalation paths on incidents assigned to you or your teams; each notification says who did it (e.g.
[assigned to you] escalated to you by Bob — Disk full) - low-urgency PagerDuty incidents are tagged
· low urgencyand notify silently; setpagerduty.low_urgency_sound: trueto keep the sound.pagerduty.notify_team_incidents: falselimits notifications to incidents assigned to you (plus escalations / responder requests aimed at you) - Jira changes made by apps/automation rules (e.g. "Automation for Jira" moving a ticket to Code Review right after you opened a PR) no longer notify, unless the rule assigns the issue to you. New
jira.suppress_automationkey (defaulttrue) turns this off github.ci_notify(default["fail"]) picks which CI roll-up states on your own open PRs pop up.pending— which every push of yours produces — is now remembered silently instead of notifying; add"pending"to hear about it again, or set[]to silence CI roll-ups entirely- failing sources are no longer silent. The Status ▸ submenu shows when the last check ran and, per source, the live error (
Jira: ⚠ HTTP 401 unauthorized — check the API token / username,timed out,TLS certificate verification failed (corporate proxy?), …) instead of a misleading✓ Ready; a ⚠ badge appears next to the tray icon while a source or the config has problems; a "check problems" notification tells you which source failed and why (once per distinct failure on the timer, always on Check now); and Check now no longer claims "You're all caught up" when a source failed. Status ▸ also gained View log - Pause notifications ▸ (1 hour / 4 hours / until resumed) mutes pop-ups without quitting; items still land in Recent and a ⏸ badge shows while paused. The pause survives restarts
- burst protection: when one check finds more than 5 new items (first launch, back from a weekend offline) they are folded into one summary notification ("12 new updates — Jira 7 · GitHub 5 — see Recent") instead of a machine-gun of sounded pop-ups; every item is still listed under Recent
- config problems are visible: unknown keys (typos such as
supress_self) and values of the wrong type are listed under Status ▸ asConfig: ⚠ …and logged once, instead of being silently ignored; an unparsable file is shown there too - the "setup needed" / "Nothing to check" / dependency-check notifications carry an Open button that opens
config.json - macOS: if the app was moved since Start at login was enabled, the LaunchAgent is re-pointed at the current location on the next launch; enabling it while running from the mounted DMG is refused with an explanation (that path vanishes when the image is ejected); failures to toggle it are reported instead of silently leaving the checkbox unchanged
poll.interval_secondsedits take effect on the next config reload (no relaunch)- the PagerDuty ▸ menu lists every escalation level you are currently on with level-specific wording — On-call now (level 1), Backup on-call (level 2), Fallback on-call (level N) — plus your next shift; each row opens its schedule / escalation policy in PagerDuty so the menu can be checked against the service page. A schedule-less entry is labelled "direct policy target, no end".
pagerduty.oncall_max_level(default1) decides which levels count as "on-call" for the header, the Status line and the shift reminders - pre-release builds: tagging
vX.Y.Z-<suffix>(e.g.v2.0.0-beta) publishes a GitHub pre-release, which is excluded from/releases/latestso existing installs are not offered it by the in-app updater; the CHANGELOG[Unreleased]section is left in place for the final release. The updater now ranks a pre-release below its final version, so2.0.0-betausers are offered2.0.0(and2.0.0users are never offered the beta)
Changed
- GitHub is now off by default (
github.enabled: falsein both the runtime defaults and the first-run config template), matching PagerDuty. Set"enabled": trueundergithubto turn it on; existing config files are not affected - the poll cursor is only advanced when every enabled source fetched successfully. Previously a failed fetch (401, timeout, VPN not up yet after wake) looked like "no news" and the window moved on, so the events from that interval were lost for good; they are now fetched on the next successful check (fingerprints prevent duplicates from the sources that did succeed)
- Jira, GitHub and PagerDuty are fetched concurrently and in isolation: a slow source no longer delays the others, and an unexpected exception in one source is recorded as that source's error instead of aborting the whole poll and discarding the results already fetched
- Check dependencies (and Status ▸ Re-check now) re-reads
config.jsonfirst, so the documented "fill in the file, save, click Check dependencies" flow works immediately instead of after the next 5-minute poll - the unconfigured-state reminder ("Nothing to check") is shown once per distinct problem on the timer instead of every 5 minutes, and is always shown on a manual Check now (which used to end in silence)
- the in-app updater now requires a matching SHA-256 from the release's
SHA256SUMS.txt; a download whose checksum file cannot be fetched, or that is not listed, is discarded with an explanation (previously it was opened unverified with only a log line). The macOS menu item is Download update… and the follow-up says what to actually do (quit, drag-replace, relaunch, and thexattrline for Gatekeeper) instead of "Installer opened — follow the installer" - Status ▸ distinguishes
GitHub: ⚠ Needs gh CLIfrom⚠ Needs login (gh auth login) config.jsonis written atomically and created user-readable only (0600); menu actions (theme, skip version) patch just the key they change viaconfig.save_config_patchand refuse to write while the file is unparsable- the
ghlogin lookup is skipped entirely when GitHub is disabled (it logged a WARN on every poll for non-GitHub users) - docs: step-by-step guide to creating the PagerDuty User API Token (where the page is, the direct URL pattern, why not to use an admin General Access key, how to verify and revoke) in the TUTORIAL and README, plus a troubleshooting entry for
PagerDuty: ⚠ HTTP 401 - docs: install steps lead with the
xattr/ "Open Anyway" path (right-click → Open no longer works on macOS 15), note the Apple-Silicon-only DMG, the "Background Items Added" notice and first-launch scan delay; new Updating section and expanded troubleshooting (permission denied, Focus allow-list, body-vs-Open click, stale login item, two icons, config typos, HTTP 401/timeout/TLS); Windows uninstall covers the installer; README gained a Known limitations section; Python requirement corrected to 3.9+;scripts/doctor.shchecks quarantine, architecture, JSON validity and a stale LaunchAgent path; the DMG "READ ME FIRST" and release-notes template were refreshed - GitHub
ci_activitythreads ("workflow run failed for … branch") are suppressed undergithub.suppress_self: by GitHub's definition they are workflow runs you triggered, and CI on your open PRs is already covered by the roll-up items (so a failure no longer pops up twice) - the Jira identity lookup (
/rest/api/3/myself) is cached for 6 hours and, if a refresh fails, the last known id is reused; the GitHub login auto-detection is cached too - PagerDuty incident notifications are now driven by the incident timeline (
/log_entries) instead of polling incident status: every event has a stable id, so each acknowledge / resolve / escalate / reassign notifies exactly once, transitions that don't change the status (reassign, escalate) are no longer missed, and resolves of incidents assigned to you are detected even when you have no teams or the incident is old. A new incident's trigger + initial assignment is reported as a single notification pagerduty.suppress_selfnow applies to incidents assigned to you as well (previously only to team incidents), so acknowledging your own incident no longer pops up a notification- ...
Dev Notifier 2.0.0-beta.1
Menu-bar / tray notifier for Jira, GitHub & PagerDuty (macOS + Windows).
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS (Apple Silicon) | DevNotifier-2.0.0-beta.1.dmg |
Open, drag into Applications, then see the note below |
| Windows | DevNotifier-2.0.0-beta.1-setup.exe |
Run the installer (per-user; SmartScreen: More info -> Run anyway) |
| Windows (portable) | DevNotifier-2.0.0-beta.1-portable.exe |
Just run it |
Verify file integrity via the attached
SHA256SUMS.txt(the in-app updater does this automatically).
macOS note (first launch and after every update)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized and macOS blocks it with "is damaged and can't be
opened". Clear the quarantine flag once in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
or use System Settings -> Privacy & Security -> Open Anyway after the
first attempt. (On macOS 14 and earlier, right-click -> Open also works.)
What's changed
Added
- PagerDuty on-call shift reminders: a heads-up before your shift starts (default 1 day and 1 hour before,
pagerduty.oncall_remind_before_minutes), when it starts, and when it ends (silent), sourced from/oncalls. Turn off withpagerduty.oncall_reminders: false - a PagerDuty ▸ menu (when enabled) showing whether you are on-call right now and until when (or when your next shift starts), and the open incidents assigned to you — click one to open it. The Status line also shows
· on-call - PagerDuty now notifies when an incident is escalated or reassigned to you, when someone requests you as a responder, when a note mentions you, and on notes, priority/urgency changes, snoozes, ack timeouts and exhausted escalation paths on incidents assigned to you or your teams; each notification says who did it (e.g.
[assigned to you] escalated to you by Bob — Disk full) - low-urgency PagerDuty incidents are tagged
· low urgencyand notify silently; setpagerduty.low_urgency_sound: trueto keep the sound.pagerduty.notify_team_incidents: falselimits notifications to incidents assigned to you (plus escalations / responder requests aimed at you) - Jira changes made by apps/automation rules (e.g. "Automation for Jira" moving a ticket to Code Review right after you opened a PR) no longer notify, unless the rule assigns the issue to you. New
jira.suppress_automationkey (defaulttrue) turns this off github.ci_notify(default["fail"]) picks which CI roll-up states on your own open PRs pop up.pending— which every push of yours produces — is now remembered silently instead of notifying; add"pending"to hear about it again, or set[]to silence CI roll-ups entirely- failing sources are no longer silent. The Status ▸ submenu shows when the last check ran and, per source, the live error (
Jira: ⚠ HTTP 401 unauthorized — check the API token / username,timed out,TLS certificate verification failed (corporate proxy?), …) instead of a misleading✓ Ready; a ⚠ badge appears next to the tray icon while a source or the config has problems; a "check problems" notification tells you which source failed and why (once per distinct failure on the timer, always on Check now); and Check now no longer claims "You're all caught up" when a source failed. Status ▸ also gained View log - Pause notifications ▸ (1 hour / 4 hours / until resumed) mutes pop-ups without quitting; items still land in Recent and a ⏸ badge shows while paused. The pause survives restarts
- burst protection: when one check finds more than 5 new items (first launch, back from a weekend offline) they are folded into one summary notification ("12 new updates — Jira 7 · GitHub 5 — see Recent") instead of a machine-gun of sounded pop-ups; every item is still listed under Recent
- config problems are visible: unknown keys (typos such as
supress_self) and values of the wrong type are listed under Status ▸ asConfig: ⚠ …and logged once, instead of being silently ignored; an unparsable file is shown there too - the "setup needed" / "Nothing to check" / dependency-check notifications carry an Open button that opens
config.json - macOS: if the app was moved since Start at login was enabled, the LaunchAgent is re-pointed at the current location on the next launch; enabling it while running from the mounted DMG is refused with an explanation (that path vanishes when the image is ejected); failures to toggle it are reported instead of silently leaving the checkbox unchanged
poll.interval_secondsedits take effect on the next config reload (no relaunch)- the PagerDuty ▸ menu lists every escalation level you are currently on with level-specific wording — On-call now (level 1), Backup on-call (level 2), Fallback on-call (level N) — plus your next shift; each row opens its schedule / escalation policy in PagerDuty so the menu can be checked against the service page. A schedule-less entry is labelled "direct policy target, no end".
pagerduty.oncall_max_level(default1) decides which levels count as "on-call" for the header, the Status line and the shift reminders - pre-release builds: tagging
vX.Y.Z-<suffix>(e.g.v2.0.0-beta) publishes a GitHub pre-release, which is excluded from/releases/latestso existing installs are not offered it by the in-app updater; the CHANGELOG[Unreleased]section is left in place for the final release. The updater now ranks a pre-release below its final version, so2.0.0-betausers are offered2.0.0(and2.0.0users are never offered the beta)
Changed
- the poll cursor is only advanced when every enabled source fetched successfully. Previously a failed fetch (401, timeout, VPN not up yet after wake) looked like "no news" and the window moved on, so the events from that interval were lost for good; they are now fetched on the next successful check (fingerprints prevent duplicates from the sources that did succeed)
- Jira, GitHub and PagerDuty are fetched concurrently and in isolation: a slow source no longer delays the others, and an unexpected exception in one source is recorded as that source's error instead of aborting the whole poll and discarding the results already fetched
- Check dependencies (and Status ▸ Re-check now) re-reads
config.jsonfirst, so the documented "fill in the file, save, click Check dependencies" flow works immediately instead of after the next 5-minute poll - the unconfigured-state reminder ("Nothing to check") is shown once per distinct problem on the timer instead of every 5 minutes, and is always shown on a manual Check now (which used to end in silence)
- the in-app updater now requires a matching SHA-256 from the release's
SHA256SUMS.txt; a download whose checksum file cannot be fetched, or that is not listed, is discarded with an explanation (previously it was opened unverified with only a log line). The macOS menu item is Download update… and the follow-up says what to actually do (quit, drag-replace, relaunch, and thexattrline for Gatekeeper) instead of "Installer opened — follow the installer" - Status ▸ distinguishes
GitHub: ⚠ Needs gh CLIfrom⚠ Needs login (gh auth login) config.jsonis written atomically and created user-readable only (0600); menu actions (theme, skip version) patch just the key they change viaconfig.save_config_patchand refuse to write while the file is unparsable- the
ghlogin lookup is skipped entirely when GitHub is disabled (it logged a WARN on every poll for non-GitHub users) - docs: install steps lead with the
xattr/ "Open Anyway" path (right-click → Open no longer works on macOS 15), note the Apple-Silicon-only DMG, the "Background Items Added" notice and first-launch scan delay; new Updating section and expanded troubleshooting (permission denied, Focus allow-list, body-vs-Open click, stale login item, two icons, config typos, HTTP 401/timeout/TLS); Windows uninstall covers the installer; README gained a Known limitations section; Python requirement corrected to 3.9+;scripts/doctor.shchecks quarantine, architecture, JSON validity and a stale LaunchAgent path; the DMG "READ ME FIRST" and release-notes template were refreshed - GitHub
ci_activitythreads ("workflow run failed for … branch") are suppressed undergithub.suppress_self: by GitHub's definition they are workflow runs you triggered, and CI on your open PRs is already covered by the roll-up items (so a failure no longer pops up twice) - the Jira identity lookup (
/rest/api/3/myself) is cached for 6 hours and, if a refresh fails, the last known id is reused; the GitHub login auto-detection is cached too - PagerDuty incident notifications are now driven by the incident timeline (
/log_entries) instead of polling incident status: every event has a stable id, so each acknowledge / resolve / escalate / reassign notifies exactly once, transitions that don't change the status (reassign, escalate) are no longer missed, and resolves of incidents assigned to you are detected even when you have no teams or the incident is old. A new incident's trigger + initial assignment is reported as a single notification pagerduty.suppress_selfnow applies to incidents assigned to you as well (previously only to team incidents), so acknowledging your own incident no longer pops up a notification- the PagerDuty identity lookup (
/users/me) is cached for 6 hours instead of running on every poll whenuser_id/team_idsare left blank, and incident/timeline/on-call queries follow pagination instead of stopping at 50 results - the "All good" dependency-check and "setup needed" messages now mention PagerDuty (previously only Jira/GitHub); the TUTORIAL documents
suppress_selfand the new PagerDuty options - Windows releases now ship a real installer, `DevNotifier--se...
Dev Notifier 2.0.0-beta
Menu-bar / tray notifier for Jira, GitHub & PagerDuty (macOS + Windows).
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS (Apple Silicon) | DevNotifier-2.0.0-beta.dmg |
Open, drag into Applications, then see the note below |
| Windows | DevNotifier-2.0.0-beta-setup.exe |
Run the installer (per-user; SmartScreen: More info -> Run anyway) |
| Windows (portable) | DevNotifier-2.0.0-beta-portable.exe |
Just run it |
Verify file integrity via the attached
SHA256SUMS.txt(the in-app updater does this automatically).
macOS note (first launch and after every update)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized and macOS blocks it with "is damaged and can't be
opened". Clear the quarantine flag once in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
or use System Settings -> Privacy & Security -> Open Anyway after the
first attempt. (On macOS 14 and earlier, right-click -> Open also works.)
What's changed
Added
- PagerDuty on-call shift reminders: a heads-up before your shift starts (default 1 day and 1 hour before,
pagerduty.oncall_remind_before_minutes), when it starts, and when it ends (silent), sourced from/oncalls. Turn off withpagerduty.oncall_reminders: false - a PagerDuty ▸ menu (when enabled) showing whether you are on-call right now and until when (or when your next shift starts), and the open incidents assigned to you — click one to open it. The Status line also shows
· on-call - PagerDuty now notifies when an incident is escalated or reassigned to you, when someone requests you as a responder, when a note mentions you, and on notes, priority/urgency changes, snoozes, ack timeouts and exhausted escalation paths on incidents assigned to you or your teams; each notification says who did it (e.g.
[assigned to you] escalated to you by Bob — Disk full) - low-urgency PagerDuty incidents are tagged
· low urgencyand notify silently; setpagerduty.low_urgency_sound: trueto keep the sound.pagerduty.notify_team_incidents: falselimits notifications to incidents assigned to you (plus escalations / responder requests aimed at you) - Jira changes made by apps/automation rules (e.g. "Automation for Jira" moving a ticket to Code Review right after you opened a PR) no longer notify, unless the rule assigns the issue to you. New
jira.suppress_automationkey (defaulttrue) turns this off github.ci_notify(default["fail"]) picks which CI roll-up states on your own open PRs pop up.pending— which every push of yours produces — is now remembered silently instead of notifying; add"pending"to hear about it again, or set[]to silence CI roll-ups entirely- failing sources are no longer silent. The Status ▸ submenu shows when the last check ran and, per source, the live error (
Jira: ⚠ HTTP 401 unauthorized — check the API token / username,timed out,TLS certificate verification failed (corporate proxy?), …) instead of a misleading✓ Ready; a ⚠ badge appears next to the tray icon while a source or the config has problems; a "check problems" notification tells you which source failed and why (once per distinct failure on the timer, always on Check now); and Check now no longer claims "You're all caught up" when a source failed. Status ▸ also gained View log - Pause notifications ▸ (1 hour / 4 hours / until resumed) mutes pop-ups without quitting; items still land in Recent and a ⏸ badge shows while paused. The pause survives restarts
- burst protection: when one check finds more than 5 new items (first launch, back from a weekend offline) they are folded into one summary notification ("12 new updates — Jira 7 · GitHub 5 — see Recent") instead of a machine-gun of sounded pop-ups; every item is still listed under Recent
- config problems are visible: unknown keys (typos such as
supress_self) and values of the wrong type are listed under Status ▸ asConfig: ⚠ …and logged once, instead of being silently ignored; an unparsable file is shown there too - the "setup needed" / "Nothing to check" / dependency-check notifications carry an Open button that opens
config.json - macOS: if the app was moved since Start at login was enabled, the LaunchAgent is re-pointed at the current location on the next launch; enabling it while running from the mounted DMG is refused with an explanation (that path vanishes when the image is ejected); failures to toggle it are reported instead of silently leaving the checkbox unchanged
poll.interval_secondsedits take effect on the next config reload (no relaunch)- pre-release builds: tagging
vX.Y.Z-<suffix>(e.g.v2.0.0-beta) publishes a GitHub pre-release, which is excluded from/releases/latestso existing installs are not offered it by the in-app updater; the CHANGELOG[Unreleased]section is left in place for the final release. The updater now ranks a pre-release below its final version, so2.0.0-betausers are offered2.0.0(and2.0.0users are never offered the beta)
Changed
- the poll cursor is only advanced when every enabled source fetched successfully. Previously a failed fetch (401, timeout, VPN not up yet after wake) looked like "no news" and the window moved on, so the events from that interval were lost for good; they are now fetched on the next successful check (fingerprints prevent duplicates from the sources that did succeed)
- Jira, GitHub and PagerDuty are fetched concurrently and in isolation: a slow source no longer delays the others, and an unexpected exception in one source is recorded as that source's error instead of aborting the whole poll and discarding the results already fetched
- Check dependencies (and Status ▸ Re-check now) re-reads
config.jsonfirst, so the documented "fill in the file, save, click Check dependencies" flow works immediately instead of after the next 5-minute poll - the unconfigured-state reminder ("Nothing to check") is shown once per distinct problem on the timer instead of every 5 minutes, and is always shown on a manual Check now (which used to end in silence)
- the in-app updater now requires a matching SHA-256 from the release's
SHA256SUMS.txt; a download whose checksum file cannot be fetched, or that is not listed, is discarded with an explanation (previously it was opened unverified with only a log line). The macOS menu item is Download update… and the follow-up says what to actually do (quit, drag-replace, relaunch, and thexattrline for Gatekeeper) instead of "Installer opened — follow the installer" - Status ▸ distinguishes
GitHub: ⚠ Needs gh CLIfrom⚠ Needs login (gh auth login) config.jsonis written atomically and created user-readable only (0600); menu actions (theme, skip version) patch just the key they change viaconfig.save_config_patchand refuse to write while the file is unparsable- the
ghlogin lookup is skipped entirely when GitHub is disabled (it logged a WARN on every poll for non-GitHub users) - docs: install steps lead with the
xattr/ "Open Anyway" path (right-click → Open no longer works on macOS 15), note the Apple-Silicon-only DMG, the "Background Items Added" notice and first-launch scan delay; new Updating section and expanded troubleshooting (permission denied, Focus allow-list, body-vs-Open click, stale login item, two icons, config typos, HTTP 401/timeout/TLS); Windows uninstall covers the installer; README gained a Known limitations section; Python requirement corrected to 3.9+;scripts/doctor.shchecks quarantine, architecture, JSON validity and a stale LaunchAgent path; the DMG "READ ME FIRST" and release-notes template were refreshed - GitHub
ci_activitythreads ("workflow run failed for … branch") are suppressed undergithub.suppress_self: by GitHub's definition they are workflow runs you triggered, and CI on your open PRs is already covered by the roll-up items (so a failure no longer pops up twice) - the Jira identity lookup (
/rest/api/3/myself) is cached for 6 hours and, if a refresh fails, the last known id is reused; the GitHub login auto-detection is cached too - PagerDuty incident notifications are now driven by the incident timeline (
/log_entries) instead of polling incident status: every event has a stable id, so each acknowledge / resolve / escalate / reassign notifies exactly once, transitions that don't change the status (reassign, escalate) are no longer missed, and resolves of incidents assigned to you are detected even when you have no teams or the incident is old. A new incident's trigger + initial assignment is reported as a single notification pagerduty.suppress_selfnow applies to incidents assigned to you as well (previously only to team incidents), so acknowledging your own incident no longer pops up a notification- the PagerDuty identity lookup (
/users/me) is cached for 6 hours instead of running on every poll whenuser_id/team_idsare left blank, and incident/timeline/on-call queries follow pagination instead of stopping at 50 results - the "All good" dependency-check and "setup needed" messages now mention PagerDuty (previously only Jira/GitHub); the TUTORIAL documents
suppress_selfand the new PagerDuty options - Windows releases now ship a real installer,
DevNotifier-<version>-setup.exe(Inno Setup; per-user, no admin rights): Start Menu entry, uninstaller, an optional "start when I sign in" task, and in-place upgrades that close the running app and relaunch it. The bare one-file exe is still published asDevNotifier-<version>-portable.exe. The in-app updater prefers the installer asset - Windows builds carry the release version (bundled
APP_VERSIONstamp plus aVERSIONINFOresource visible in Properties ▸ Details) and ship a proper multi-size.ico ghis also looked up in its usual Windows install lo...
Dev Notifier 1.5.8
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.8.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Added
- actions you trigger yourself no longer notify you: Jira changelog changes/comments you authored, PagerDuty status changes you made (e.g. you acknowledged/resolved), and GitHub threads whose latest activity was your own are now suppressed. This is on by default and controlled per source via a new
suppress_selfconfig key (set it tofalseunderjira/github/pagerdutyto keep being notified of your own activity). Jira matches on youraccountId(resolved via/rest/api/3/myself), PagerDuty on youruser_id, and GitHub on your login
Full compare: v1.5.7...v1.5.8
Dev Notifier 1.5.7
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.7.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Added
- the menu's Recent list now persists across restarts/upgrades: up to the 100 most recent items are saved to
state.json(via the atomic writer) and restored on launch, instead of resetting to empty every time the app quits. The menu still shows the newest 10, and removing a shown item now backfills the next kept item into view; the id counter is persisted too so restored entries can't collide with new ones
Full compare: v1.5.6...v1.5.7
Dev Notifier 1.5.6
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.6.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Fixed
- menu-bar menu actions work again on macOS: clicking a Recent item's "Open"/"Remove" or switching the theme did nothing since the platform-backend refactor. rumps calls the callback with its own menu item as the sender, but the handlers read tag attributes (
entry_id,theme_name) that live on the toolkit-neutral menu item; the macOS backend now passes the neutral item through as the sender (matching the Windows backend), so those tags survive
Full compare: v1.5.5...v1.5.6
Dev Notifier 1.5.5
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.5.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Fixed
- clicking the notification's "Open" button now reliably opens the item's URL. Notifications that carry a link now include an explicit "Open" action button; previously only clicking the notification body worked, because macOS does not deliver the system default button's click (with the URL) to the app
- GitHub notifications no longer re-notify the same thread repeatedly. The de-duplication fingerprint now keys on the notification thread id alone instead of
id+updated_at; previously any new activity in a thread (comment, push, re-requested review) bumpedupdated_atand minted a fresh fingerprint, so the same item popped up again - the seen-items state is now written atomically (temp file +
os.replace). A crash or kill mid-write can no longer leave a truncatedstate.jsonthat fails to parse on restart and resets the de-dup memory, which would otherwise re-notify every currently-unread item
Full compare: v1.5.4...v1.5.5
Dev Notifier 1.5.4
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.4.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Changed
- internal groundwork toward cross-platform support: introduced a
platform_backendabstraction (system integration: open-URL, start-at-login, main-thread dispatch) and a cross-platformpathsmodule for config/cache directories. macOS behaviour and paths are unchanged;rumpsis now an install requirement only on macOS (seedocs/windows-support-plan.md) - added a Windows platform backend implementing the system-integration surface: open-URL via
os.startfile, start-at-login via the per-userRunregistry key, and native toast notifications (with a clickable "Open" action) viawinotify. The Windows tray/menu UI is not wired up yet; this is the backend foundation.winotifyis an install requirement only on Windows - the auto-updater is now cross-platform: the cache directory uses the shared
pathshelper, the release fetch selects the current platform's installer asset (.exeon Windows,.dmgon macOS) while keeping the macOSdmg_*fields, and the download step launches the installer viaos.startfileon Windows /openon macOS. Windows-frozen builds read their version from the bundled__version__. macOS behaviour and paths are unchanged - Windows packaging and CI: added a PyInstaller spec (
packaging/dev-notifier-win.spec) producing a one-fileDevNotifier.exe, a packaging script (packaging/windows_package.ps1) that names itDevNotifier-<version>.exe(matched by the updater), atest-windowsCI job running the suite onwindows-latest, and abuild-windowsrelease job that builds the.exeand publishes it alongside the macOS DMG in the same GitHub Release (with combinedSHA256SUMS.txt) - the tray/menu UI is now fully behind the platform backend:
notifier_appis toolkit-neutral (no directrumpsimport) and drives the active backend through its interface. macOS renders the menu/icon/notifications/timers viarumpsexactly as before; Windows renders a real tray icon and right-click menu viapystray(withPillowfor icon images) pluswinotifytoasts.pystrayandPilloware install requirements only on Windows - documentation: the README and TUTORIAL now cover Windows alongside macOS — install (
.exe/ SmartScreen), theghCLI viawinget, the%APPDATA%config path, start-at-login via theRunregistry entry, troubleshooting, and uninstall - friendlier onboarding for non-technical users: the first-run config file is now a simple template showing only the settings you fill in (Jira/GitHub/PagerDuty), each with a short plain-language note; advanced tuning options (
poll.*,jira.event_mode, etc.) are omitted from the file but keep their built-in defaults. The TUTORIAL was reorganised into a click-only Quick start plus an Advanced section, and the README config example was slimmed to the three Jira fields most users need - a broken/typo'd config file is no longer silently discarded: the app still starts with defaults for that run, but your file is left unchanged and a note is written to the log so you can fix the typo without losing your edits
Fixed
- on Windows the config/state/log files now live under
%APPDATA%\dev-notifier(via the sharedpathshelper) instead of a.configfolder in the home directory; macOS keeps~/.config/dev-notifierunchanged
Full compare: v1.5.3...v1.5.4
Dev Notifier 1.5.3
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.3.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Added
- Jira notifications are now event-level to match Jira's notification feed: instead of one notification per updated issue, each in-window status/assignee change and each comment is notified individually. Controlled by
jira.event_mode(default on) andjira.event_fields(default["status", "assignee"]; comments are always included). Setjira.event_modetofalsefor the previous issue-level behaviour
Fixed
- Jira timestamps with a timezone offset lacking a colon (e.g.
-0400) are now parsed correctly; previously they raisedValueErroron Python < 3.11 and could silently drop comment/changelog events - the
seende-duplication TTL now scales withpoll.max_window_minutes(window + 3-day margin) so an event still inside the lookback window is never re-notified after its de-dup record would have expired
Full compare: v1.5.2...v1.5.3
Dev Notifier 1.5.2
macOS menu-bar notifier for Jira & GitHub.
Download & Install
| Platform | File | How to install |
|---|---|---|
| macOS | DevNotifier-1.5.2.dmg |
Open, then drag into Applications |
Verify file integrity via the attached
SHA256SUMS.txt.
macOS note (first launch)
This is a free, open-source app without an Apple Developer certificate,
so it is not notarized. On first launch:
right-click DevNotifier.app -> Open -> click Open again in the dialog.
If it says "damaged and can't be opened", run in Terminal:
xattr -dr com.apple.quarantine /Applications/DevNotifier.app
What's changed
Changed
- first-run poll lookback (
poll.window_minutes, the fallback used when there is no prior poll) now defaults to 24 hours instead of 10 minutes, so the very first poll after install surfaces the past day's activity
Fixed
- "Check for updates" failing with "Couldn't check / Check your network" because the updater verified TLS with the default CA store, which the packaged app / stock macOS Python cannot use to verify
api.github.com; it now uses thecertifiCA bundle (same fix already applied to Jira/PagerDuty)
Full compare: v1.5.1...v1.5.2