Choose where every link on your Mac opens.

Grinch is a menu-bar app you set as your default browser. Your JavaScript rules send each link from Slack, Mail, or any other app to the right browser, profile, or app.

macOS 13 or later · Universal binary · Signed and notarized · MIT licensed

~/.config/grinch.js
module.exports = {  default: "com.apple.Safari",  rewrite: [strip("utm_*")],  rules: [    { match: "github.com", open: "Google Chrome:Default" },    { match: "zoom.us/j/*", open: "us.zoom.xos" },  ],};
Terminal
Grinch --test "https://github.com/?utm_source=slack"URL:     https://github.com/?utm_source=slackFinal:   https://github.com/Browser: com.google.ChromeArgs:    --profile-directory=DefaultGrinch --test "https://zoom.us/j/123456789"URL:     https://zoom.us/j/123456789Final:   https://zoom.us/j/123456789Browser: us.zoom.xosGrinch --test "https://example.com/"URL:     https://example.com/Final:   https://example.com/Browser: com.apple.Safari

What Grinch does

Small, native, and checkable

Grinch is one native binary. It evaluates your config with the system's JavaScriptCore and compiles declarative rules to native matchers, so a hostname rule resolves in about 40 nanoseconds on Apple Silicon. See the benchmarks and how to reproduce them.

A config that fails to reload never takes routing down: Grinch keeps the last config that loaded and shows the error in the menu bar. Grinch --test shows a decision without opening a browser, and the diagnostic log records which rule sent each link where.

Coming from Finicky?

Grinch is inspired by Finicky and Finch. Most Finicky v4 configs work with Grinch, including export default and Finicky's key names. Moving from Finicky covers the differences.

Documentation