You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- History viewer read a session-id log that never exists; read per-pane logs (splitRoot.allPaneIds) and concatenate them
- Reset reveal counter on warm-terminal claim so it no longer flashes the previous $HOME prompt before its own cd && clear
- Verify warm terminal process is alive before handoff; dead PTY falls back to a cold spawn
- Implement processTerminated: clear exited terminals and reset status so the tab/notch no longer freeze on a dead shell
- Strip C1 control chars (U+0080-U+009F) from notification text
- Surface checkpoint-restore failures instead of swallowing with try?
- Measure real working duration for the taskCompleted filter
- Sparkle appcast advertises minimum macOS 26.0 (was 14.0)
- Remove dead code; de-duplicate buffer-read and launch-command paths
Copy file name to clipboardExpand all lines: CHANGELOG.md
+19-1Lines changed: 19 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [0.23.2] - 2026-05-29
11
+
12
+
### Security
13
+
- Notification text now strips C1 control characters (U+0080–U+009F, including NEL and CSI) in addition to C0/DEL, closing a notification-spoofing vector from hostile terminal output.
14
+
15
+
### Fixed
16
+
- Session history viewer always showed "No history". History is written per pane, but the viewer read a log keyed by the session id (a file that never exists). It now reads and concatenates every pane's log in the session's split tree.
17
+
- Claimed warm-pool terminals briefly flashed the previous shell's `$HOME` prompt because the reveal counter wasn't reset. A claimed terminal now stays hidden until its own `cd && clear` completes.
18
+
- A warm terminal whose shell had already exited could be handed to a new tab. The pool now verifies the process is alive before handoff and falls back to a fresh spawn.
19
+
- A terminal whose shell exited (`exit`, crash, failing login script) left the tab/notch showing a frozen status and leaked the dead terminal. `processTerminated` now clears it and resets status (a later reselect respawns a fresh shell).
20
+
- Restoring a checkpoint no longer fails silently — the error is logged instead of being swallowed by `try?`.
21
+
- "Task completed" notifications were suppressed for many real tasks: the trivial-task filter measured wall time including the 3-second confirmation delay. It now measures actual working duration.
22
+
23
+
### Changed
24
+
- Sparkle appcast now advertises the correct minimum macOS (26.0). It previously defaulted to 14.0, offering the update to systems that cannot run the app.
25
+
- Internal cleanup: removed dead code and de-duplicated the terminal buffer-reading and launch-command paths (no behavior change).
26
+
10
27
## [0.23.1] - 2026-05-28
11
28
12
29
### Changed
@@ -229,7 +246,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Copy file name to clipboardExpand all lines: CLAUDE.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,7 @@ Notchly is a macOS menu bar app that provides a floating terminal panel anchored
18
18
19
19
## Architecture
20
20
21
-
**App lifecycle**: `NotchyApp` (in `BotdockApp.swift`) uses `@NSApplicationDelegateAdaptor` to delegate to `AppDelegate`, which owns the `NSStatusItem` (menu bar icon), the `TerminalPanel`, and the `NotchWindow`. The SwiftUI `App` body is an empty `Settings` scene — all UI lives in the panel and notch window.
21
+
**App lifecycle**: `NotchyApp` (in `NotchyApp.swift`) uses `@NSApplicationDelegateAdaptor` to delegate to `AppDelegate`, which owns the `NSStatusItem` (menu bar icon), the `TerminalPanel`, and the `NotchWindow`. The SwiftUI `App` body is an empty `Settings` scene — all UI lives in the panel and notch window.
22
22
23
23
**Notch integration**: `NotchWindow` is an always-visible `NSPanel` positioned over the MacBook notch. It detects notch dimensions via `NSScreen.auxiliaryTopLeftArea`/`auxiliaryTopRightArea`, tracks mouse hover to trigger the main panel, and expands with a bounce animation (via `CVDisplayLinkWrapper`) when any session is working. `NotchPillContent` (SwiftUI) renders status icons (spinner, checkmark, warning) inside the pill. `NotchDisplayState` computes a priority-based aggregate status across all sessions.
24
24
@@ -46,7 +46,7 @@ Notchly is a macOS menu bar app that provides a floating terminal panel anchored
46
46
47
47
| File | Purpose |
48
48
|------|---------|
49
-
|`BotdockApp.swift`| App entry point (`NotchyApp`) |
49
+
|`NotchyApp.swift`| App entry point (`NotchyApp`) |
50
50
|`AppDelegate.swift`| Menu bar icon, hotkey, hover tracking, panel lifecycle |
51
51
|`TerminalManager.swift`| Terminal creation, `ClickThroughTerminalView`, status detection, autocomplete integration |
@@ -70,4 +70,4 @@ Notchly is a macOS menu bar app that provides a floating terminal panel anchored
70
70
71
71
## Entitlements
72
72
73
-
The app requires `com.apple.security.automation.apple-events` for AppleScript communication with Xcode.
73
+
`Notchy.entitlements` is currently empty (`<dict/>`) — the app is unsandboxed (required: it spawns the user's login shell and runs arbitrary commands) and declares no special entitlements. There is no AppleScript/Xcode-automation code. If Developer-ID signing + notarization is added later, any needed entitlement must be declared explicitly here, since CI currently signs ad-hoc (`CODE_SIGN_IDENTITY="-"`) and the hardened runtime isn't truly enforced.
0 commit comments