Skip to content

Tags: ptrinh/Notiful

Tags

v1.1.3

Toggle v1.1.3's commit message
1.1.3: don't mistake phone numbers for OTPs

The instant-capture banner path stuffs the whole banner (title+body) into
the body field, so a Google Voice missed-call banner like "(484) 466-8855"
leaked its "466-8855" tail as a false OTP. The embedded-number guard only
caught fully hyphen-chained numbers; a parenthesized/space-separated area
code broke the chain.

Add phoneRanges() (NANP-style grouping, optional country code / parens) and
skip any clean-fallback candidate overlapping a phone number.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.1.2

Toggle v1.1.2's commit message
1.1.2: clearer auto-copy banner + body-only OTP extraction

- Banner now reads "Copied to clipboard" when the code was auto-copied,
  instead of always "Click to copy".
- OTP heuristic scans the message body only. A non-OTP SMS from a 5-digit
  short-code sender (e.g. Google Voice) no longer has the sender number in
  the title mistaken for a code.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.1.1

Toggle v1.1.1's commit message
1.1.1: minimize idle CPU and halve the binary size

CPU — idle wakeups eliminated or reduced:
- Banner-watcher self-heal is now event-driven (KVO on
  NSWorkspace.runningApplications, which includes UI agents) instead of a
  30-second timer that enumerated every running app
- Accessibility-not-granted retry backs off 2s -> 60s instead of waking the
  process every 2 seconds forever
- Fallback scan timer default 15s -> 60s with leeway scaled to the interval;
  safe because the watcher now re-arms the WAL kqueue itself (brief retries)
  after a checkpoint instead of relying on the timer
- Capture latency unchanged: kqueue remains the real-time path

Binary size (universal): 1.94 MB -> 933 KB (-52%):
- Build with -Osize and -dead_strip
- Strip local/debug symbols before codesign

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

v1.1.0

Toggle v1.1.0's commit message
Notiful 1.1.0: instant-capture reliability, smarter OTP extraction, S…

…wiftUI settings, donation model

OTP extraction:
- Score each notification field separately (body first) so an SMS short-code
  sender in the title (e.g. "35127") can never beat the real code in the body
- Multilingual OTP keywords (vi, es, pt, fr, de, it, ja, zh, ko, ru, ar, hi, th, …)

Reliability / UX:
- "Copy Last Code" menu item + Recent Codes submenu (last 5, session-only)
- Auto-start the moment Full Disk Access is granted — no relaunch needed
- Menu health warning when instant capture is on but Accessibility is missing
  (the grant is silently revoked whenever the binary is replaced)
- Locale-proof banner auto-dismiss: AX close-button subrole first, then
  localized labels across 16 languages
- Notiful's banners auto-remove from Notification Center after 2 minutes;
  new "hide code in banner" privacy option keeps codes off the lock screen
- Progress notification while "Open Notiful's log…" collects the log

Settings window rewritten in SwiftUI:
- Sources tab: recent-notifications table (timestamps, watched checkmarks),
  card-style source rows, full per-source editor (all match criteria, custom
  regex, every action) — nothing requires hand-editing config.json anymore
- Settings tab: clipboard auto-clear, banner privacy, default regex with
  validation, fallback scan interval (applies live; watcher restarts)

Performance:
- All DB work (copy + SQLite + bplist decode) moved off the main thread
- One state.json write per scan instead of per record
- Failed scans no longer advance the change stamp (transient errors retry)
- Watermark can no longer skip codes in a burst (no fixed row cap)

Licensing removed — back to the donation model:
- Delete license/trial code, vendor signing tool and LICENSING.md
- "Donate ♥…" menu item next to About

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

v1.0.6

Toggle v1.0.6's commit message
v1.0.6: notarized Developer ID build; drop --no-quarantine

The release is now signed with a Developer ID certificate and notarized +
stapled by Apple, so it launches without any Gatekeeper workaround.

- Casks: bump to 1.0.6, remove the ad-hoc / --no-quarantine / xattr caveats.
- README: install instructions no longer need --no-quarantine or manual
  quarantine removal.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.5

Toggle v1.0.5's commit message
v1.0.5: show version on the About screen

- Welcome/About now displays a dimmed "Version X.Y.Z" line (read from
  CFBundleShortVersionString, so it tracks future bumps automatically).
- Fix a stale "Configure…" reference to "Sources & advanced settings…".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.4

Toggle v1.0.4's commit message
v1.0.4: clearer menu, editable sources, end-user README

UX/UI pass based on a usability review:

Menu (AppDelegate)
- Live status header (watching N sources / paused, last code captured)
- "Pause/Resume watching" instead of bare "Disable"
- Grouped under a "Settings" section; de-jargoned labels
- indentationLevel instead of leading spaces
- "Open log" now exports filtered log lines instead of an unfiltered Console
- Confirm before hiding the menu bar icon
- "Credit" renamed to "About Notiful"

Config window (ConfigWindowController)
- Plain-language match summaries and add buttons
- New Edit… to rename a source / fix its matching text
- Confirm before Remove; action buttons disabled until a row is selected
- Empty-state guidance on both tables
- Multiline command editor

Welcome: donation/credit shown only via About, not first-run onboarding.
Docs: README restructured for end-users; advanced details collapsed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.3

Toggle v1.0.3's commit message
v1.0.3: lower idle CPU/wakeups + hardened signing

Performance:
- scanNew filters by the watermark in SQL, so idle/fallback scans decode ~0
  records instead of the newest 50 every tick.
- Sparser fallback timers with leeway (poll 2s->15s, banner health 10s->30s)
  to reduce idle wakeups / improve battery.

Signing:
- Hard-fail the build on any codesign error + strict-verify, so we can never
  silently produce an unsigned app (which was resetting FDA/Accessibility).
- Strip the post-sign com.apple.FinderInfo xattr that trips --strict.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.2

Toggle v1.0.2's commit message
v1.0.2: stable self-signed signing, correct identifier, persisted cap…

…ture logs

- Sign with a stable self-signed identity (scripts/make-signing-cert.sh) so
  Full Disk Access + Accessibility grants persist across rebuilds, instead of
  ad-hoc signing which reset them every build.
- Fix codesign: strip xattrs before signing so the identifier is correctly
  com.notiful.app (was falling back to "Notiful"), which had confused TCC.
- Log captures at .notice so they persist, and label each as
  "INSTANT (Accessibility)" vs "database (~5s delay)".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v1.0.1

Toggle v1.0.1's commit message
v1.0.1: instant capture self-heals independent of the menu bar icon

The AX banner observer was only re-armed on menu open, so with the menu
bar icon hidden it never recovered after the NotificationCenter process
restarted. Add a 10s health timer and PID-change detection so instant
capture keeps working (and self-heals) whether or not the icon is shown.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>