Skip to content

Add menu-bar-icon-search extension - #31267

Merged
raycastbot merged 13 commits into
raycast:mainfrom
mguellsegarra:ext/menu-bar-icon-search
Oct 5, 2026
Merged

raycastbot merged 13 commits into
raycast:mainfrom
mguellsegarra:ext/menu-bar-icon-search

Conversation

@mguellsegarra

@mguellsegarra mguellsegarra commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Description

Adds Menu Bar Icon Search, a Raycast extension for finding and opening macOS menu bar app icons, including icons hidden through macOS 27’s Menu Bar settings.

Search by app or item name, choose a result with the arrow keys, and press Return to open its menu. A native Swift module, built with Raycast's Swift tools, presses the selected item through macOS Accessibility; it does not reveal the icon or change its Menu Bar setting. A hidden item's menu may open at the upper-left corner of the screen because macOS does not expose an on-screen position for its icon. Raycast requires Accessibility access; no separate app needs to be installed.

This searches app icons on the right side of the menu bar. Raycast’s built-in Search Menu Bar Items command searches the active app’s File, Edit, and other menus.

Source and setup details: https://github.com/mguellsegarra/menu-bar-icon-search

Screencast

CleanShot.2026-09-18.at.16.59.00.mp4

Checklist


Note

Medium Risk
The extension requires Accessibility trust and programmatically presses menu bar UI on the user’s Mac; behavior depends on per-app AX exposure and could misfire or open menus in unexpected positions for hidden items.

Overview
Adds a new Menu Bar Icon Search Raycast extension under extensions/menu-bar-icon-search so users can search and open right-side macOS menu bar app icons (including ones hidden via Menu Bar settings) without revealing them in the bar.

The Search Menu Bar Icons command shows a filterable list with cached last-scan results, optional inclusion of system items (preference), refresh, and copy-details for diagnostics. Selecting an item closes Raycast and triggers activation via a native Swift module that scans running apps through Accessibility (kAXExtrasMenuBarAttribute, AXPress) and deduplicates entries; untrusted AX state surfaces an empty view with a link to Accessibility settings.

Packaging includes TypeScript UI (search-menu-bar.tsx), Swift package with Raycast macros (scan / press), and standard extension metadata (README, changelog, MIT license, eslint/tsconfig).

Reviewed by Cursor Bugbot for commit 7b87807. Bugbot is set up for automated code reviews on this repo. Configure here.

@raycastbot raycastbot added new extension Label for PRs with new extensions platform: macOS labels Sep 18, 2026
@raycastbot

Copy link
Copy Markdown
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@mguellsegarra
mguellsegarra marked this pull request as ready for review September 18, 2026 15:04
@greptile-apps

greptile-apps Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[Low risk] Adds a new Raycast extension for menu bar icon search.

The PR should wait until the Initial Release heading uses the required merge-date placeholder.

Findings

  1. P2 Changelog date will be wrong ▶
Fix with agent prompt
### Issue 1
extensions/menu-bar-icon-search/CHANGELOG.md:3
The Initial Release entry in `CHANGELOG.md` replaces `{PR_MERGE_DATE}` with a fixed date. The repository requires that placeholder so the changelog gets the date when the PR merges. Restore it before merging.

```suggestion
## [Initial Release] - {PR_MERGE_DATE}
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

Menu Bar Icon Search adds a Raycast command for finding and opening macOS menu bar app icons, including hidden icons, through Accessibility.

  • Searches by app or item name and lets you open a result from the keyboard.
  • Shows saved results while scanning again and keeps system items optional.
  • Adds the native Swift module and extension setup, docs, and images.

Reviews (10) · Last reviewed commit: "Update CHANGELOG.md and optimise images"

Comment thread extensions/menu-bar-icon-search/build-helper.sh Outdated
Comment thread extensions/menu-bar-icon-search/swift/MenuBarHelper.swift Outdated
Comment thread extensions/menu-bar-icon-search/src/search-menu-bar.tsx Outdated
Comment thread extensions/menu-bar-icon-search/package.json
Comment thread extensions/menu-bar-icon-search/src/search-menu-bar.tsx Outdated
Comment thread extensions/menu-bar-icon-search/eslint.config.mjs Outdated
@0xdhrv 0xdhrv added the difficulty:hard Review effort suggested by Review Hub (hard). label Sep 28, 2026

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @mguellsegarra 👋

Thanks for your contribution 🔥 Really nice standalone Accessibility approach for opening menu bar app icons (including ones hidden via System Settings → Menu Bar), and clear callout vs Raycast’s built-in Search Menu Bar Items.

Here's everything I found in this pass:

Blocking

  • CHANGELOG still describes the old reveal/restore behavior, but the helper now only presses via Accessibility (and the README correctly says it does not reveal the icon). Please update the Initial Release bullets so the Store changelog matches the shipping behavior, e.g. drop or rewrite:
- Temporarily reveal hidden icons in the real menu bar, then restore their hidden state and the pointer position.

Optional

  • You can simplify the failure toast with showFailureToast(error) from @raycast/utils (add that dependency if you go this route).
  • A second Window Capture screenshot for the Accessibility-required empty state would help Store users understand setup.

When the blocking items are done, press Ready for review. I've converted the PR to a draft until then 😊

Feel free to reach me here or on Slack if anything is unclear.

@0xdhrv
0xdhrv marked this pull request as draft September 30, 2026 14:47
@0xdhrv 0xdhrv self-assigned this Sep 30, 2026
@mguellsegarra

Copy link
Copy Markdown
Contributor Author

Hey @0xdhrv 👋 thanks a lot for the review and the kind words!

All done:

  • CHANGELOG: rewrote the bullet so it now says icons are opened through macOS Accessibility, without revealing them in the real menu bar.
  • showFailureToast: switched to showFailureToast(error) and added @raycast/utils.
  • Second screenshot: added metadata/menu-bar-icon-search-2.png showing the Accessibility-required empty state.

Marking it as ready for review. Let me know if anything else comes up 🙌

@mguellsegarra
mguellsegarra marked this pull request as ready for review September 30, 2026 15:22

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @mguellsegarra 👋

Thanks for your contribution 🔥 Nice work wiring Accessibility via the helper and cleaning up the CHANGELOG / showFailureToast after the last round.

Here's everything I found in this pass:

Blocking

  • Retake metadata/menu-bar-icon-search-2.png with a fresh Capture Window of the real Accessibility-denied empty state
  • Update the PR description — it still describes reveal / restore pointer behavior, but the extension is AXPress-only now (matches README / CHANGELOG)

issue (blocking): metadata/menu-bar-icon-search-2.png does not look like a clean fresh Window Capture.

What I saw on the file history:

  • the first upload of -2.png carried Adobe XMP (XMP Core), mismatched EXIF vs PNG size, and flat black corners
  • the current -2.png shares bit-identical background rows with metadata/menu-bar-icon-search.png, and the same PNG date:create as shot 1, while only date:timestamp is newer — that reads as a re-saved / edited derivative of the Sep 18 asset, not a new capture

Please retake it with the Capture Window command (tick Save to Metadata):

  1. Run the extension with npm run dev
  2. Put the helper / Raycast in a real AX-denied state (revoke Accessibility for the helper or Raycast, then reopen the command)
  3. Capture the empty state (Accessibility Access Required / grant-access copy) and overwrite -2.png

Docs: https://developers.raycast.com/basics/prepare-an-extension-for-store#screenshots

issue (blocking): The PR body still says the extension temporarily reveals the icon, clicks it, then restores hidden state and pointer position. The current code path is AXPress-only. Please update the description so Store reviewers and future readers match README / CHANGELOG.

When the blocking items are done, press Ready for review. I've converted the PR to a draft until then 😊

Feel free to reach me here or on Slack if anything is unclear.

@0xdhrv
0xdhrv marked this pull request as draft October 1, 2026 02:04
Replace metadata/menu-bar-icon-search-2.png with a fresh Capture Window
of the real Accessibility-denied empty state, as requested in review.
@mguellsegarra
mguellsegarra marked this pull request as ready for review October 1, 2026 07:35
@mguellsegarra

Copy link
Copy Markdown
Contributor Author

@0xdhrv done! thanks again ;)

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @mguellsegarra 👋

Thanks for your contribution 🔥 Nice work retaking the Accessibility empty-state screenshot and cleaning up CHANGELOG / showFailureToast after the last rounds — the AXPress-only helper approach is clear in README and code.

Here's everything I found in this pass:

Blocking

  • Update the PR description — it still describes reveal / restore pointer behavior, but the extension is AXPress-only now (matches README / CHANGELOG)

Should fix

  • Prefer shipping the native helper the same way as Color Picker — a Swift Package under swift/ with Raycast's @raycast macros, imported from TypeScript via swift:../swift/… — instead of build-helper.sh (swiftc/lipo) + committed assets/menubar-helper + execFile. That keeps the helper typed, rebuilds with ray build, and avoids committing architecture-specific binaries.

Reference: color-picker (swift/color-picker/Package.swift, Sources/, and import("swift:…") in src/).

As mentioned in the Swift tools here ↗

When the blocking items are done, press Ready for review. I've converted the PR to a draft until then 😊

Feel free to reach me here or on Slack if anything is unclear.

@0xdhrv
0xdhrv marked this pull request as draft October 2, 2026 04:37
Replace build-helper.sh, the committed universal binary and execFile with a Swift package under swift/ using @raycast macros, imported from TypeScript via swift:. Accessibility is now granted to Raycast. Retake the empty-state screenshot to match.
@mguellsegarra

Copy link
Copy Markdown
Contributor Author

Hey @0xdhrv 👋 thanks again for the review!

  • Updated the PR description to match the AXPress-only behavior.
  • Retook the Accessibility empty-state screenshot.
  • Moved the native helper to a Swift Package under swift/ using the @raycast macros, imported via swift:, as in Color Picker. build-helper.sh and the committed binary are gone; the extension now builds with ray build.

Marking it as ready for review 🙌

@mguellsegarra
mguellsegarra marked this pull request as ready for review October 2, 2026 07:30

@0xdhrv 0xdhrv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, approved ✅

@raycastbot
raycastbot merged commit 2323ae6 into raycast:main Oct 5, 2026
2 checks passed

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 7b87807. Configure here.

} finally {
setIsRefreshing(false);
}
}, []);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refresh race overwrites newer scan

Medium Severity

Overlapping refresh calls are not serialized, so an earlier scanMenuBar can finish after a later one and replace newer items. isRefreshing can also flip off while a second scan is still running. Opening the command and pressing the refresh shortcut during the first scan triggers this.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 7b87807. Configure here.

@@ -0,0 +1,7 @@
# Menu Bar Icon Search Changelog

## [Initial Release] - 2026-10-05

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Changelog date will be wrong

The Initial Release entry in CHANGELOG.md replaces {PR_MERGE_DATE} with a fixed date. The repository requires that placeholder so the changelog gets the date when the PR merges. Restore it before merging.

Suggested change
## [Initial Release] - 2026-10-05
## [Initial Release] - {PR_MERGE_DATE}

Rule Used: What: In Raycast extension changelogs, {PR_MERGE_DATE} is a template variable that should be left as-is in Initial Release entries. Do not suggest replacing it with actual dates or "Unreleased" sections. Why: This is the standard Raycast conventio... (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/menu-bar-icon-search/CHANGELOG.md
Line: 3

Comment:
**Changelog date will be wrong**

The Initial Release entry in `CHANGELOG.md` replaces `{PR_MERGE_DATE}` with a fixed date. The repository requires that placeholder so the changelog gets the date when the PR merges. Restore it before merging.

```suggestion
## [Initial Release] - {PR_MERGE_DATE}
```

**Rule Used:** What: In Raycast extension changelogs, `{PR_MERGE_DATE}` is a template variable that should be left as-is in Initial Release entries. Do not suggest replacing it with actual dates or "Unreleased" sections.  Why: This is the standard Raycast conventio... ([source](https://app.greptile.com/raycast/github/raycast/extensions/-/custom-context?memory=799af734-ebd9-4b40-9ffd-97a70fc71c8a))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Published to the Raycast Store:
https://raycast.com/mguellsegarra/menu-bar-icon-search

@raycastbot

Copy link
Copy Markdown
Collaborator

🎉 🎉 🎉

We've rewarded your Raycast account with some credits. You will soon be able to exchange them for some swag.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

difficulty:hard Review effort suggested by Review Hub (hard). new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants