Open plugin platform · API v1.5

Put your workflow in Finder’s context menu.

Build independent plugins with JavaScript or TypeScript. No Xcode project, Apple Developer account, or RightMenu source change required.

01

Open by design. Host authority stays closed.

A RightMenu plugin is an independently maintained JavaScript package. The host owns validation, installation, consent, and execution boundaries; a plugin receives only capabilities declared for the current action and granted by the user.

Security boundary

Plugins have no ambient authority and cannot load native code. File access, mutation, AI disclosure, and system authorization remain host-controlled, separate decisions.

Independent lifecycle

The host and every plugin keep separate repositories, versions, and release cadences. Plugin business logic, copy, icons, assets, and release notes belong in the plugin repository.

The current scope covers open development, local import, and user trust only. It does not include a marketplace, community index, or automatic updates.

02

Quick start

After installing RightMenu, use the signed command-line tool bundled inside the app to generate a project and run doctor.

Bundled CLI path

/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl

Generate a runnable project

init refuses to overwrite an existing path. The generated project includes a runnable plugin, the API v1.5 Schema, and the matching TypeScript declaration.

CLI="/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl"
"$CLI" init ./MyPlugin \
  --id dev.example.my-plugin \
  --name "My Plugin"
"$CLI" doctor ./MyPlugin
Optional Build with an AI Agent

Copy this standard instruction into Codex, Claude Code, Cursor, or another Agent. It reads the generated project's local contracts first and treats a passing doctor run as the completion gate.

Develop a RightMenu Plugin API v1.5 plugin in the current directory.

Plugin requirement: [describe the plugin here]

Requirements:
- Read README.md, schema/rightmenu-plugin-manifest-v1.5.schema.json, and types/rightmenu-plugin-api-v1.5.d.ts first.
- Modify only this plugin project; do not change the RightMenu host source.
- Produce JavaScriptCore-compatible output, bundle every import, and use no Node.js require or native code.
- Declare requiredCapabilities for every action and uiContribution, and keep permissions minimal.
- After changing payload files, update byteCount and SHA-256 in manifest.json files.
- Finish by running "/Applications/RightMenu.app/Contents/Helpers/rightmenu-pluginctl" doctor .
- Completion requires doctor to exit 0 and report validation.ok.
- Do not generate a private key, sign, or pack unless explicitly requested.

03

Generated package structure

Plugin packages end in .rightmenuplugin. manifest.json declares the entrypoint, actions, access, and every payload file; distribute bundled plain JavaScript only.

MyPlugin/
├── README.md
├── plugin/
│   └── my-plugin.rightmenuplugin/
│       ├── manifest.json
│       └── main.js
├── schema/
│   └── rightmenu-plugin-manifest-v1.5.schema.json
└── types/
    └── rightmenu-plugin-api-v1.5.d.ts

04

Manifest and API v1.5

Every Finder action and UI contribution must declare requiredCapabilities; use an empty array when none are needed. Each capability must appear in permissions, and unused broad permissions are rejected.

{
  "apiVersion": "1.5",
  "permissions": [{
    "capability": "selection.read",
    "reason": "Reads metadata for selected Finder items."
  }],
  "actions": [
    { "id": "about", "title": "About", "requiredCapabilities": [] },
    { "id": "inspect", "title": "Inspect", "requiredCapabilities": ["selection.read"] }
  ],
  "uiContributions": []
}
globalThis.rightMenuPlugin = Object.freeze({
  run(actionID, input) {
    if (actionID !== "inspect") return { handled: false };
    return RightMenu.call("selection.read", {});
  }
});

JSON Schema improves editor feedback. rightmenu-pluginctl doctor remains authoritative for filesystem safety, digests, cross-array rules, compatibility, and signatures.

05

Develop and validate with doctor

After changing JavaScript, update byteCount and SHA-256 for every changed file in the manifest, then run doctor. It emits at most 32 bounded diagnostics and exits nonzero when any error exists.

  1. 1

    Produce JavaScriptCore-compatible output; bundle every import and leave no Node.js require calls.

  2. 2

    Update byte counts and SHA-256 values in files; never list manifest.json itself.

  3. 3

    Run doctor until validation.ok, then resolve API, capability, signature, or package diagnostics.

"$CLI" doctor ./MyPlugin
"$CLI" doctor ./MyPlugin/plugin/my-plugin.rightmenuplugin

06

Local import and Developer Mode

Open RightMenu → Settings → Plugins. Use Import Signed Plugin for signed packages. For an unsigned directory, explicitly enable Developer Mode, then choose Import Unsigned Development Plugin. The roots are physically separate.

validate package → review publisher → install → review Plugin Access → enable → project runnable actions into Finder

Installation is not consent. The host validates before and after copying and completes installation only after the final move. Disabling Developer Mode prevents unsigned invocation.

07

Action-scoped access

API v1.5 evaluates capabilities per action. A missing grant hides only dependent actions; other authorized actions remain available. Every grant is revocable.

selection.readSelection information · explicit grant
vision.recognizeTextLocal text recognition · explicit grant
files.rename.*File rename · explicit grant, with mutation confirmation retained
ai.generateStructuredStructured AI · explicit grant plus per-plugin/provider disclosure consent
ui.flashScreen / desktopItems.toggleVisibilityScreen effect and desktop visibility · automatic, revocable
diagnostics.logDiagnostics · explicit grant

08

Publisher signing and fingerprints

Production distribution uses Ed25519. On first import from an unknown self-issued publisher, the user compares the full SHA-256 public-key fingerprint before choosing Trust & Install. Signing identity grants no runtime capability.

"$CLI" keygen ./publisher.private.json "Example Publisher"
"$CLI" sign \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin \
  ./publisher.private.json
"$CLI" inspect-signature \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin
"$CLI" pack \
  ./MyPlugin/plugin/my-plugin.rightmenuplugin \
  ./my-plugin.rightmenuplugin.zip

Keep the private-key file outside the project, back it up securely, and never commit or distribute it. Losing it prevents existing installations from accepting updates under the same publisher identity.

An update for an installed plugin ID must use the exact same signing key. Even another trusted key cannot take over. Automatic updates and key rotation are not part of this version.

09

Common diagnostic codes

Automation should read the stable code and process exit status, never parse explanatory text.

validation.okManifest, file sizes, and digests passed.
api.current / api.legacyCurrent or compatible legacy API.
capability.unsupportedThe host does not provide a declared capability.
signature.missingUnsigned; Developer Mode only.
signature.self-issued-validSelf-issued publisher identity and signature passed.
manifest.*Bounded manifest contract failure.
package.*Bounded package layout, integrity, or limit failure.
invocation.*Bounded host or Runner lifecycle result.

10

Compatibility and runtime constraints

New projects use API v1.5 and require RightMenu 0.1.41 or later. v1.5 remains backward-compatible with v1.0–v1.4; older packages keep plugin-wide access behavior. Target JavaScriptCore and bound loops, recursion, memory, and output.

Finder actions support eligible selections of 1–20 local regular files. Before invocation, the host re-scans and revalidates the action and its exact grant set.

11

Version-pinned reference files

These files are byte-for-byte copies from the Documentation directory in RightMenu 0.1.41 (commit 9a25a54). A website check script prevents the public copies from drifting from the host truth source.