macOS: no way to opt out of Jcode.app / notification broker bundles
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 19.9k
- Forks
- 2.3k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 30
Description
Summary
On macOS, a CLI-only install still gets two app bundles created in ~/Applications:
Jcode.app(launcher,com.jcode.launcher)Jcode Notifications.app(notification broker)
There does not appear to be a way to opt out. Deleting them is not persistent: they are recreated on the next TUI start.
I installed jcode as a terminal tool and would like a supported way to keep it that way.
Environment
- jcode
v0.75.0 (5ae238574), stable channel - macOS 26.6.1 (25G76), Apple Silicon (aarch64)
- Terminal: Ghostty 1.3.1
- Installed at
~/.local/bin/jcode
Steps to reproduce
- Remove both bundles from
~/Applications. - Start the
jcodeTUI, then quit. - Both bundles are present again.
What I checked first
I wanted to be sure I had not just missed a setting:
- No key under
[display],[features], or[safety]controls bundle creation. safety.desktop_notifications = falseandnotifications.turn_complete = falsedo not prevent the broker bundle. Creation does not appear to be gated on notifications being enabled at all.launch_hotkeys.enabled = false(and removing the hotkey LaunchAgent) does not preventJcode.app.- CLI subcommands such as
jcode version,jcode session list, andjcode usagedo not trigger creation. Only the TUI startup path does. JCODE_MACOS_NOTIFICATION_BROKER_APPexists in the binary, but as far as I can tell it only affects the send path;macos_notification_broker_dir()incrates/jcode-setup-hints/src/macos_launcher.rs(lines 121-124) hardcodes~/Applications, so it cannot relocate the bundle.
Looking at should_refresh_macos_app_launcher() (lines 18-30 and 315-323), refresh happens when desktop_shortcut_created is false, when either bundle fails its validity check, or when a legacy bundle exists. For the launcher, macos_app_launcher_is_valid() (lines 276-281) is a file-existence check, so a deleted bundle is indistinguishable from a corrupted one and gets repaired. The broker additionally checks a version marker (macos_notification_broker_is_valid(), lines 147-154), so it is also reinstalled after every upgrade. Self-healing makes sense; there just seems to be no way to express "I removed this deliberately".
The only workaround I found is to occupy both paths with immutable zero-byte files so creation fails. jcode handles the failure gracefully, which is nice, but obviously not a supported configuration path.
Possible directions
Any of these would work for my case:
- A config key to skip bundle creation for CLI-only installs.
- Gating the broker bundle on
desktop_notifications = false. - Placing the helper bundles under
~/.jcode/instead of~/Applications, where the rest of jcode's runtime state already lives.
#215 (closed) raised the ~/Applications/Jcode.app surprise for the installer path and was addressed with an icon. This is the same surprise from the TUI startup path, from the angle of wanting no bundles at all.
This is macOS-specific and easy for me to test here, so I am glad to check any behavior or provide more detail if useful.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in crates/jcode-setup-hints/src/macos_launcher.rs, reading should_refresh_macos_app_launcher(), macos_app_launcher_is_valid(), macos_notification_broker_dir(), and macos_notification_broker_is_valid(). Trace the TUI startup path and configuration handling before choosing among the proposed opt-out approaches. Done means a supported CLI-only configuration prevents both bundles from being created or recreated, with the behavior verifiable on macOS.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, rust
- Domain
- cli, desktop
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100