Skip to content

Repository files navigation

EasyRight

English | 中文 | 🚀 Releases

EasyRight icon

CI status macOS 13.0+ Swift 6.0 MIT License

EasyRight is a free, open-source Finder context-menu assistant for macOS. The current source registers 30 actions. Enabled actions that apply to the current selection appear directly in the top-level menu by default; a categorized submenu layout remains available.

A FinderSync extension renders menus and captures context, while the host app performs file operations, interaction, and background work. The app contains no ads, telemetry, or background update polling.

Interface

Finder top-level menu Actions and canvas
Finder top-level context menu Action search, presets, and menu canvas
Preferences and permissions Health diagnostics
Finder extension, scope, and file access Context-menu health diagnostics
Custom apps Dark mode
Custom applications integration Studio in dark mode

Highlights

  • 30 built-in actions for file creation, cut/paste, path copying, terminals/editors, hashes, QR codes, and image conversion.
  • Custom application actions: Add any installed macOS applications (such as Keka for archive compression/extraction, Typora, IINA, Sublime Merge, etc.) to the Finder context menu with precise filtering rules (all items, folders only, files only, or matching specific file extensions).
  • Top-level menu by default with favorites first and no oversized separator gap; categorized mode is optional.
  • Action profiles: Essential, Professional, and Custom. Profiles never batch-enable advanced actions.
  • Fast filtering by title, action ID, category, and status.
  • Everywhere or custom scope covering common Finder roots, iCloud/CloudStorage, and mounted volumes by default.
  • Layered health diagnostics for menu service, Full Disk Access, and the action queue, with one prioritized repair action.
  • Reliable action queue using Pending -> InFlight -> terminal acknowledgement and abandoned-lease recovery.
  • Explicit update checks that run only after the user clicks Check for Updates.
  • Homebrew tool management that distinguishes standalone apps from Homebrew-managed installs before installing, updating, or repairing iTerm2, Warp, VS Code, Sublime Text, and Cursor.
  • Bilingual interface & instant language switching: Seamless English and Simplified Chinese switching directly in Preferences without requiring app relaunch.
  • Instant layout presets: Switch between Minimalist, Developer, and Power User starter presets directly from the title bar or Preferences.
  • Universal 2 support for Apple Silicon and Intel Macs.

30 Actions

Category Count Actions
New files 9 .txt, .md, .json, .csv, .html, .docx, .xlsx, .pptx, .pdf
File management 9 Cut, Paste, Permanent Delete, Copy Full Path, Copy Name, Copy To, Move To, Copy Shell-Safe Path, Copy Git-Relative Path
Terminals/editors 6 Terminal, iTerm2, Warp, Visual Studio Code, Sublime Text, Cursor
Utilities 6 MD5, SHA-256, Toggle Hidden Files, Clipboard Text to QR Code, Convert to PNG, Convert to JPEG

Note

Low-frequency professional actions are off by default. Permanent Delete, Copy To, Move To, and Toggle Hidden Files are advanced actions: they are off by default and require confirmation. Actions that depend on third-party apps are shown only when the corresponding app is installed. Users can freely add any local application via the "Custom Apps" settings panel (e.g. binding Keka.app with .zip,.7z,.rar extensions for extraction or folders for compression).

Architecture

flowchart LR
    F[Finder / FinderSync] -->|schema v2 event| P[PendingActions]
    F -->|File Provider fallback| S[macOS Services]
    S -->|schema v2 event| P
    P -->|atomic lease| I[InFlightActions]
    I --> H[Host ActionDispatcher]
    H --> R[Interactive or background Runner]
    R -->|success / failure / cancellation| A[Acknowledge lease]
    I -->|host exits unexpectedly| P
    H --> D[FailedActions / OSLog diagnostics]
Loading
  • DefaultActionRegistry is the action source of truth for the host, FinderSync, settings, and tests.
  • Finder menu rendering performs no network request, external process, or large-file work.
  • The website distribution route exchanges configuration and events through the extension container while FinderSync remains sandboxed.
  • Batch configuration changes use one atomic commit; FinderSync refreshes its in-process cache after notification.

Permission Boundaries

Full Disk Access does not determine whether the context menu appears.

  • Finder extension registration, enablement, and watch scope determine menu visibility.
  • Full Disk Access affects file operations in some protected locations.
  • After granting access, an existing process may retain its previous state. The app offers Relaunch App and Restart Finder when a refresh still reports the old state.

Installation

Important

Current downloads are free, open-source community builds. They use an Ad-hoc signature, not a Developer ID from the paid Apple Developer Program, and they are not notarized by Apple. macOS may therefore report that it cannot verify the developer or block the first launch. This warning does not mean the file has been identified as malware, but it also means users cannot rely on an Apple-verified developer identity or notarization result. Installing through Homebrew does not change this status. Download only from this repository's Releases page and explicitly approve the app using the First Run steps below.

GitHub Release

The code, GitHub Release, and Homebrew Cask are all at the v0.1.0 community build:

Format Current downloadable artifact
DMG EasyRight-v0.1.0-macOS-Universal.dmg
ZIP EasyRight-v0.1.0-macOS-Universal.zip

See GitHub Releases for all versions.

Updates And Latest

Every stable tag produces two asset classes:

  • EasyRight-vX.Y.Z-macOS-Universal.*: immutable versioned assets for Homebrew, rollback, and SHA-256 verification.
  • EasyRight-Latest.*: convenience aliases attached to the newest stable Release for manual downloads and simple scripts.

Stable Latest entry points:

https://github.com/LightDevCoder/EasyRight/releases/latest
https://github.com/LightDevCoder/EasyRight/releases/latest/download/EasyRight-Latest.dmg
https://github.com/LightDevCoder/EasyRight/releases/latest/download/EasyRight-Latest.zip

Note

Latest paths change when a new version is published and are unsuitable as reproducible installation sources. Homebrew does not use Latest assets. It discovers versions through livecheck, then uses a versioned URL and real SHA-256.

Homebrew Cask

brew tap LightDevCoder/easyright https://github.com/LightDevCoder/EasyRight.git
brew install --cask LightDevCoder/easyright/easyright

The current Cask is pinned to an immutable v0.1.0 URL with a real SHA-256. brew upgrade advances only after this repository updates the Cask version and checksum; it does not bypass version metadata by following a mutable Latest file.

Starting with Homebrew 6.0, third-party taps require explicit trust. The fully qualified name above trusts only the easyright Cask, not the entire tap, and is the recommended command across old and new Homebrew versions. If a previous short-name install reported an untrusted tap, run:

brew trust --cask LightDevCoder/easyright/easyright
brew install --cask LightDevCoder/easyright/easyright

brew trust --cask is available only in Homebrew 6.0 and later. There is no need to grant the broader brew trust LightDevCoder/easyright permission.

Note

Homebrew verifies the download SHA-256 and installs the app, but it cannot add a Developer ID signature or Apple notarization. The first launch may still require manual approval in Privacy & Security. Using --no-quarantine to bypass that user confirmation is not recommended.

Important

The current v0.1.0 community build is Ad-hoc signed and not notarized by Apple. After a Homebrew install on a new Mac, macOS may still block the first launch. First try Control-clicking the app and choosing Open, or use System Settings -> Privacy & Security -> Open Anyway. If the app is confirmed to come from this repository and macOS still blocks it, run:

sudo /usr/bin/xattr -dr com.apple.quarantine "/Applications/EasyRight.app"
open "/Applications/EasyRight.app"

sudo prompts for the current macOS administrator password. Terminal does not display password characters while you type; this is expected. The command removes the download quarantine attribute from this app only. It does not disable Gatekeeper or add signing or notarization.

brew update
brew upgrade --cask LightDevCoder/easyright/easyright

Note

If an upgrade from v1.2.0 reports pluginkit -r com.easyright.app.extension, the failure comes from the uninstall script stored by the old Cask, not from v0.1.0 verification. Run this one-time migration: the first command removes only EasyRight's stale Homebrew receipt, and the second overwrites the app with the verified v0.1.0 DMG.

rm -rf "$(brew --caskroom)/easyright"
brew install --cask --force LightDevCoder/easyright/easyright

A normal uninstall keeps settings and runtime data, while removing dynamic quick services and refreshing the system menu:

brew uninstall --cask LightDevCoder/easyright/easyright
brew untap LightDevCoder/easyright

To also remove settings, shared containers, and failed-action data, perform a full uninstall:

brew uninstall --cask --zap easyright
brew untap LightDevCoder/easyright

Warning

--zap permanently removes user configuration and action-queue data.

For a local checkout, the current directory can be used as a local tap:

brew tap LightDevCoder/easyright "$(pwd)"
brew install --cask LightDevCoder/easyright/easyright

First Run

  1. For a DMG, drag EasyRight.app into /Applications. For a ZIP, extract it and move it there manually. Homebrew performs this step automatically.
  2. Control-click the app in Finder, choose Open, and confirm again. If macOS still blocks it, open System Settings -> Privacy & Security and choose Open Anyway near the bottom of the page.
  3. Use the precise xattr command in the FAQ only when the artifact is confirmed to come from this repository and the system UI cannot approve it. Never disable Gatekeeper globally.
  4. Open the app, then register and enable the extension on the Finder page; open System Settings if needed.
  5. Keep Watch Scope set to Everywhere, or choose Custom Directories and add folders.
  6. Grant Full Disk Access only when protected-location operations require it.
  7. Choose an action profile, favorites, and menu layout on the Actions page.

For a direct v0.1.0 DMG download, compare its SHA-256 with the value published in the Cask:

shasum -a 256 EasyRight-v0.1.0-macOS-Universal.dmg
# Expected: 9230f3db5684f537a00c15141e6dac746092ea4fef59e2ab37538d64dba46e37

Manual extension registration:

pluginkit -a /Applications/EasyRight.app/Contents/PlugIns/EasyRightExtension.appex
pluginkit -e use -i com.easyright.app.extension
killall Finder

For a local build:

pluginkit -a "$(pwd)/build/EasyRight.app/Contents/PlugIns/EasyRightExtension.appex"
pluginkit -e use -i com.easyright.app.extension
killall Finder

Build And Verification

Current community artifacts and local development builds both use an Ad-hoc signature:

./Scripts/build.sh

Artifacts:

  • build/EasyRight.app
  • build/EasyRight.zip
  • build/EasyRight.dmg
  • ActionVerifier_bin

Core checks:

swift test
bash Tests/CaskStructureTests.sh
./Scripts/validate_cask.sh
./Scripts/build.sh
codesign --verify --deep --strict --verbose=2 build/EasyRight.app
hdiutil verify build/EasyRight.dmg

ActionVerifier_bin covers 10 key workflows; it does not claim to execute all 30 actions. Apply the Professional profile on the Actions page first:

./ActionVerifier_bin

Pushing a vX.Y.Z tag currently makes CI build and publish an Ad-hoc community release automatically. It creates versioned DMG/ZIP files, Latest DMG/ZIP aliases, SHA256SUMS, and COMMUNITY_BUILD.txt. Both the Release notes and Cask disclose the non-notarized status, and existing version assets cannot be replaced in place.

The repository also retains a future Developer ID distribution path, but the project currently has no paid Apple Developer Program credentials. It can be used manually only after signing and notarization credentials are configured:

DISTRIBUTION_ROUTE=website-release \
DEVELOPER_ID_APPLICATION="Developer ID Application: Your Name (TEAMID)" \
NOTARY_PROFILE="your-notarytool-profile" \
./Scripts/build.sh

Missing paid credentials do not block an explicitly labeled community release, but community artifacts must never be described as Apple verified, notarized, or formally distributed with a Developer ID.

External Tools

Advanced -> External Tools checks these Homebrew locations:

/opt/homebrew/bin/brew
/usr/local/bin/brew

The page reads brew list --cask --versions in the background and checks whether each app exists:

  • Not installed: offers brew install --cask.
  • Managed by Homebrew: offers brew upgrade --cask --greedy, including Casks marked auto_updates.
  • App present but not managed by Homebrew: labels it as a standalone install and only offers Open; use the app's own updater.
  • Homebrew record present but app missing: offers brew reinstall --cask to repair it.

The app runs an install, update, or repair command only after an explicit click and revalidates the installation state before execution. If Homebrew is unavailable, it only offers the official website and a copyable official install command. It never runs a remote script automatically or forcibly takes over a manually installed app.

Privacy And Logs

  • No ads, telemetry, or background update polling.
  • Update checking sends a request to the GitHub Latest Release API only after explicit user action.
  • Verbose debug logging is off by default and may include menu-rendering or watched-path details when enabled.
  • Logs use OSLog; the app no longer continuously appends extension.log.
log show --predicate 'subsystem == "com.easyright.app"' --last 5m --info

The same predicate can be used in Console.app:

subsystem == "com.easyright.app"

FAQ

Full Disk Access is granted, but the app still reports it as unavailable

Return to the Finder page and click Recheck. If the state remains stale, use Relaunch App and Restart Finder. TCC state can require the relevant processes to restart before they observe a newly granted permission.

The context menu is missing in other folders

On the Finder page, verify that the extension is enabled and Watch Scope is Everywhere. The Diagnostics page should show a recent heartbeat with at least one observed entry. Menu visibility and Full Disk Access are separate states.

If Desktop or Documents is managed by iCloud Drive / File Provider, macOS may suppress third-party FinderSync actions in that domain; other FinderSync tools disappear from the same menu as well. EasyRight therefore provides two fallback levels under Services:

Control-click a file/folder -> Services -> EasyRight · 1 ★ 剪切 (favorite direct action example)
Control-click a file/folder -> Services -> EasyRight… (full action palette)

Direct services keep enabled favorites in the user's saved order, then fill from common actions such as Cut, Copy Full Path, Copy File Name, Open in Terminal, and SHA256. Entries are deduplicated and capped at eight. Numeric prefixes stabilize the order shown by macOS, and marks favorites. High-risk actions and actions whose external app is unavailable are never advertised directly. Changes to favorites, action switches, or external app availability refresh Services on demand without background polling.

The “EasyRight…” palette reuses the same action registry, settings, and transactional queue. It provides All, Common, New, Files, Terminal, and Tools views plus search. All keeps favorites first, recommendations second, and remaining categories deduplicated. Only actions that apply to the current selection are shown, and every choice is validated again before it is queued. FinderSync remains the preferred first-level menu in regular local folders.

This fallback does not request Accessibility or Automation access and does not use private APIs. Dynamic entries are stored at ~/Library/Services/EasyRightQuickActions.service and refreshed with Apple's NSUpdateDynamicServices() only when their content changes; normal and zap uninstall paths remove the generated bundle. To assign a keyboard shortcut, use System Settings -> Keyboard -> Keyboard Shortcuts -> Services and configure “EasyRight…” there; the app intentionally avoids a global default that could conflict with existing shortcuts.

How do I clear failed actions?

Diagnostics shows pending, oldest-wait, and failed counts. After confirming that failed events are no longer needed, click Clear Failed Actions.

Gatekeeper blocks a community release or local Ad-hoc build

Current GitHub Release and Cask artifacts are not notarized by Apple. First try Control-click -> Open, or System Settings -> Privacy & Security -> Open Anyway. Only after confirming that the app came from this repository, remove the quarantine attribute from this app alone:

sudo /usr/bin/xattr -dr com.apple.quarantine "/Applications/EasyRight.app"
open "/Applications/EasyRight.app"

sudo prompts for the current macOS administrator password, and Terminal does not display password characters while you type. A successful command normally prints no output; use the second command to launch the app.

Warning

Do not run sudo spctl --master-disable, do not run xattr against the entire /Applications directory, and do not bypass quarantine for an app from an unknown source. This command removes only the download quarantine marker from the specified app; it does not sign or notarize it.

Documentation

Acknowledgements

EasyRight is refactored and evolved from the open-source project MacRightClick. Sincere thanks to the original author @guyue55 and all contributors for their inspiring work and solid foundation.

License

MIT

About

Lightweight, ultra-fast, and native macOS Finder context menu assistant built with Swift & SwiftUI.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages