fluffypony/yojamPublic

open links on macOS in whatever browser, app, or profile you need - whatever yo jam is

AI summary: A macOS URL router that intercepts links and opens them in specific browsers, apps, or profiles based on custom rules.

Stars
784
Forks
410
Watchers
6
Open issues
1
Open PRs
0
Contributors
~3
Commits
264
Branches
1

SwiftBSD-3-ClauseCreated Apr 4, 2026Last push 11d agoLatest release v1.2.1

Star history

since Apr 19, 2026
0200400600Apr 2026May 2026Jun 2026Aug 2026
784 stars as of Aug 7, 2026, tracked back to Apr 19, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulAugMonWedFri2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 46 commits2026-04-05: 45 commits2026-04-06: 28 commits2026-04-07: 51 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 4 commits2026-04-18: 0 commits2026-04-19: 2 commits2026-04-20: 27 commits2026-04-21: 17 commits2026-04-22: 2 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 2 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 5 commits2026-05-06: 1 commit2026-05-07: 1 commit2026-05-08: 2 commits2026-05-09: 1 commit2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 8 commits2026-05-25: 0 commits2026-05-26: 3 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 2 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 3 commits2026-06-03: 1 commit2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 2 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 8 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits
261 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Permissive license

    BSD-3-Clause

  • Continuous integration

    Automated checks passing

What yojam does

Yojam acts as the default browser on macOS, intercepting every clicked link and intelligently routing it to the correct destination based on a powerful rules engine. Users can define routing logic by domain, prefix, regular expression, or source application, ensuring work links open in a corporate Edge profile while personal links stay in Safari. It natively supports specific browser profiles, private windows, Firefox containers, and even multi-monitor targeting to pin apps to specific displays. When a link doesn't match a rule, it provides a lightning-fast contextual picker directly at the mouse cursor.

Power users and developers on macOS who juggle multiple browser profiles, web apps, and workspaces daily.

  • Advanced rules engine: Routes URLs based on domains, regex, or the specific application that originated the click.
  • Browser profile targeting: Natively opens links in specific Chrome, Edge, or Brave profiles (e.g., Work vs Personal).
  • Container and private routing: Routes links directly into named Firefox/Orion containers or forces private browsing windows.
  • Multi-monitor pinning: Automatically targets specific displays when launching an application for a clicked link.
  • Contextual on-the-fly picker: Pops up a quick selection menu at the cursor if no default routing rule applies.

Where teams use it

Context switching

Consultants can ensure AWS links automatically open in the specific Chrome profile belonging to that client.

App forcing

Designers can force Figma or Notion links to open in their respective desktop apps instead of the web browser.

Workspace organization

Developers can route Jira links to always open on their left monitor while keeping documentation on the right.

Privacy enforcement

Users can create rules to ensure specific social media domains always open in isolated Firefox containers.

Getting started: Set Yojam as the default macOS browser and configure initial routing rules via the UI.

README

main branch

Yojam

Open links in whatever browser, app, or profile you need - whatever yo jam is.

I kept running into this problem: I clicked a link in Slack, and it opened in Safari. But I was logged into that AWS account in Chrome Profile 3, and the Figma link should just open in the desktop app, not another browser tab.

Yojam fixes that. Set it as your default browser, and it catches every link you click. Using rules you define, it routes each link exactly where it belongs - or pops up a fast picker right at your cursor so you can choose on the fly.

What it actually does

  • Rules engine: Route URLs by domain, prefix, regex, source app, or all links from a source. Send work stuff to your corporate Edge profile and personal stuff to Safari. Each rule can override the target browser's defaults: specific profile, private-window on/off, custom launch args, target display, machine scope, or named Firefox/Orion container.
  • Profile support: Targets specific profiles in Chrome, Firefox, Brave, Edge, Vivaldi, and Opera. Work profile for work links, personal for everything else.
  • Firefox and Orion containers: Rules can route into a named container (Work, Personal, Banking, etc.) through the Yojam WebExtension. The link gets reopened inside the right contextual identity instead of the default context.
  • Multi-monitor targeting: Pin a rule's output to a specific display. Jira on the left screen, Slack-forwarded links on the right, whatever you want.
  • Tracking garbage removal: Strips utm_source, fbclid, gclid, and 30+ other tracking parameters before the browser ever sees them. Per-browser or globally.
  • URL rewriting: Regex-based find/replace on URLs. Ships with disabled-by-default examples for Twitter→Nitter, Reddit→Old Reddit, Medium→Scribe.
  • Private windows: One checkbox to always open a browser in incognito/private mode. Works for Chromium, Firefox, and Safari/Orion (via AppleScript).
  • Email handling: Catches mailto: links and routes them to your preferred client.
  • Clipboard monitor: Optionally watches your clipboard and offers to open copied links.
  • Auto-learning: Yojam notices which browser you pick for each domain and starts suggesting it automatically.
  • Migrate from Bumpr, Choosy, or Finicky: Quick Start detects these on first launch and imports their rules, tagged so you can review them before committing.
  • Flat-file config: A live-editable JSON copy of your setup at ~/Library/Application Support/Yojam/config.json. Edits in the file get picked up by the app in real time, and vice-versa. Good for dotfile repos or scripted changes.
  • iCloud sync: Your rules and browser setups sync across all your Macs, with per-rule machine scope for rules that should only run on one Mac.
  • Shortcuts integration: "Open URL in Browser" and "Apply URL Rules" intents for automation.
  • Menu bar only: No dock icon, no Cmd+Tab entry. Just a menu bar icon with Link History and quick access to preferences.

Receiving links

Yojam picks up links from every source macOS can offer:

  • Clicks in any app that opens http/https URLs (the default-browser path).
  • Finder double-clicks on .html, .xhtml, .webloc, .inetloc, and .url files.
  • Handoff — pages you continue from another Apple device.
  • AirDrop — links arrive as .webloc files, which Yojam unwraps transparently.
  • macOS Share menu, via the bundled Share Extension.
  • Services menu — highlight any URL in any Cocoa app, right-click, choose Open in Yojam.
  • Browser extensions for Safari, Chrome, and Firefox.
  • The yojam:// URL scheme, for Shortcuts, Raycast, Alfred, shell scripts, and any other automation.

Every one of these goes through the same rule engine, tracker scrubber, and rewrite pipeline as a direct click. There is no second-class handling.

Installing

Install via Homebrew:

brew install --cask yojam

Or grab the DMG from yoj.am and drag Yojam to your Applications folder. On first launch, Yojam asks to become your default browser.

Yojam checks for updates automatically. You can also check manually from the menu bar icon > "Check for Updates..."

Building from source

You need macOS 14+ and Xcode 16+. Yojam uses XcodeGen for the project file.

# Install xcodegen if you haven't
brew install xcodegen

# Generate the Xcode project and build
xcodegen generate
open Yojam.xcodeproj

Build and run from Xcode. On first launch, Yojam asks to become your default browser - say yes, that's how it intercepts links.

Note: swift build / swift run compiles the code and runs tests, but won't produce a working .app bundle. macOS requires a proper app bundle with Info.plist and URL scheme registration to function as a default browser. The Share Extension, Safari Web Extension, and native messaging host are Xcode-only targets produced by xcodegen generate && xcodebuild.

Building the extensions

  • The Share Extension, Safari Web Extension, and native messaging host are Xcode-only targets. swift build only builds the bare Yojam executable and YojamCore library.
  • Extensions/build.sh produces dist/yojam-chrome.zip and dist/yojam-firefox.xpi from the shared WebExtension source. Signing and store submission are out of scope for this script.

How it works

When you click a link anywhere on your Mac, Yojam processes it through a pipeline:

  1. Global rewrites - URL transformations (regex find/replace)
  2. Tracker scrubbing - Strips tracking parameters (skipped for mailto: so subjects and bodies stay intact)
  3. Rule matching - Checks the clean URL against your routing rules top-to-bottom. First match wins.
  4. Browser-specific rewrites - Per-browser transforms after the target is determined
  5. Open or pick - If a rule matches, the link fires immediately. Otherwise, the picker appears at your cursor.

Activation modes

Mode What happens
Always show picker Unmatched links show the browser picker; matching rules still fire immediately.
Hold Shift to pick Links route via rules or your default. Keep Shift held until the picker appears to choose instead.
Smart + Fallback Rules fire automatically. Learned domains auto-route. Everything else shows the picker.

Shift also acts as a one-off escape hatch in the other modes: it skips matching rules and URL rewrites, then shows the picker with the original link. macOS delivers an external URL separately from the originating click, so keep Shift held until Yojam's picker appears.

Picker keyboard shortcuts

Key Action
1–9 Jump to browser at that position
←→ / ↑↓ Move selection
Enter / Space Open in selected browser
Cmd+C Copy URL to clipboard
Esc Dismiss picker

Rules

Yojam ships with built-in rules for Zoom, Telegram, Slack, Discord, Spotify, Apple Music, FaceTime, Apple Maps, Microsoft Teams, Figma, Linear, Notion, WhatsApp, Signal, App Store, TestFlight, and Podcasts. They auto-disable when the target app isn't installed and re-enable when it is. Built-in rules are also fully editable - tweak, duplicate, or delete them, and Restore Default Rules in Advanced brings them back.

Add your own rules matching on all URLs, domain (exact), domain suffix, URL prefix, URL substring, or regex. Rules can optionally filter by source app - only route links from Slack to your work browser, for example.

Per-rule overrides

Beyond picking the target app or browser, each rule can pin:

  • Profile - e.g. route github.com to Chrome specifically in the Work profile, while your other Chrome rules use Personal.
  • Private / incognito window - tri-state (inherit / force on / force off).
  • Browser container - route Firefox or Orion into a named container. Needs the Yojam WebExtension enabled in the selected browser.
  • Target display - send the browser window to a particular monitor after it opens (requires Accessibility permission).
  • Custom launch arguments - pass whatever CLI flags the target needs, with $URL as the placeholder.
  • Machine scope - keep an iCloud-synced rule active only on the Mac where it was created.
  • New instance - open a separate app instance for custom Chromium --user-data-dir setups.

These overrides only apply to the specific rule, so a rule-level private-window toggle won't flip the browser's own default.

Source-app sentinels for rules

For ingress paths that don't have a real originating app, Yojam uses synthetic bundle identifiers. You can target these in rules to handle links differently depending on how they arrived:

Sentinel Ingress path
com.yojam.source.handoff Handoff from another Apple device
com.yojam.source.airdrop AirDropped .webloc files
com.yojam.source.share-extension Share menu
com.yojam.source.service Services menu
com.yojam.source.safari-extension Safari extension
com.yojam.source.chrome-extension Chrome/Chromium extension
com.yojam.source.firefox-extension Firefox extension
com.yojam.source.url-scheme yojam:// URL scheme

For example, you could write a rule like: Source App = com.yojam.source.handoff → always open in Work profile.

Share Extension

The Share Extension adds "Open in Yojam" to the macOS share menu. It shows up in Safari, Notes, Mail, Finder, Reminders, Photos, and other apps that support the share sheet. One tap forwards the URL to Yojam silently.

To enable it: System Settings > Privacy & Security > Extensions > Sharing, then turn on Yojam.

Services menu

The "Open in Yojam" entry appears in the Services menu in every Cocoa app. Highlight any URL text, right-click, and pick it from the Services submenu.

To add a global keyboard shortcut: System Settings > Keyboard > Keyboard Shortcuts > Services, find "Open in Yojam", and assign a shortcut.

Browser extensions

Safari

Ships inside Yojam.app. Enable it in Safari > Settings > Extensions.

Chrome / Brave / Edge / Vivaldi / Arc

Download yojam-chrome.zip from the latest GitHub release, unzip it, then load the extracted folder as an unpacked extension. Until a stable Chrome Web Store ID is published, the unpacked build uses the yojam:// fallback and Chrome may ask once before handing the link to Yojam. The no-prompt native-messaging path will be enabled for the store build.

Firefox

Firefox release builds require Mozilla-signed extensions, and Yojam is not on AMO yet. The raw yojam-firefox.xpi attached to GitHub releases is for Orion and Firefox development builds configured to allow unsigned extensions. A normal Firefox install will need the AMO build once it is published.

Orion 1.1+

Container routing needs Orion 1.1 or newer and the Firefox build of the Yojam WebExtension. Download yojam-firefox.xpi from the latest GitHub release. In Orion > Settings > Advanced, allow third-party Firefox extensions. Then open Tools > Extensions > Manage Extensions, choose Add Extension, and install the XPI. See Orion's WebExtension guide for Orion's current installation and compatibility details.

What each extension does

  • Toolbar button — click to send the current tab to Yojam.
  • Context menu — right-click any link and choose "Open Link in Yojam", or right-click the page background for "Open Page in Yojam".
  • Keyboard shortcutAlt+Shift+Y sends the current tab to Yojam.

yojam:// URL scheme

Yojam registers a yojam:// URL scheme for automation. Any app, script, or shortcut can trigger it:

yojam://route?url=<percent-encoded>&source=<bundle-id>&browser=<bundle-id>&pick=1&private=1
yojam://settings

Parameters:

  • url (required): the target URL. Must decode to http, https, or mailto.
  • source (optional): bundle identifier for source-app rule matching.
  • browser (optional): force a specific target browser by bundle ID, skipping rules.
  • pick=1 (optional): force the picker regardless of activation mode.
  • private=1 (optional): open in private/incognito window if the target browser supports it.

Example Shortcuts recipe: create a Shortcut with an "Open URL" action pointing at yojam://route?url= followed by the URL you want to route.

Custom apps

Not limited to browsers. Click + Add in the Browsers tab and pick any .app or executable. For apps that don't natively handle URLs, use $URL where the link belongs. Without it, Yojam appends the URL after your custom arguments:

$URL
--url $URL
--browse $URL

Yojam passes these arguments directly - no shell involved. For Chromium-based browsers, set Data Dir when an entry should use a custom --user-data-dir; the profile menu reloads from that directory and Yojam opens it as a new app instance. $HOME and leading ~/ are expanded without invoking a shell.

Settings

Six tabs in preferences (menu bar icon > Preferences, or Cmd+,):

  • General - Activation mode, picker layout and direction, launch at login, clipboard monitoring, iCloud sync, Quick Start
  • Browsers - Reorder, enable/disable, profiles, private mode, per-browser tracker stripping, custom icons, custom launch args
  • Link Handling - Routing rules, rewrite rules, global tracker stripping, URL tester. Each rule supports the per-rule overrides listed above.
  • Integrations - Health dashboard for default browser, .webloc handler, yojam:// scheme, Handoff, Share Extension, Safari extension, native messaging hosts, App Group access. One-click repair buttons for each.
  • Advanced - Debug logging, tracker parameter list, smart routing data, import from Bumpr/Choosy/Finicky, flat-file config panel, import/export settings, uninstall, reset
  • About - Version info, license, links

On first launch Yojam shows a Quick Start card above the tabs that walks you through default-browser registration and, if any are installed, offers to import rules from Bumpr, Choosy, or Finicky.

The URL tester on the Link Handling tab lets you paste a URL and see exactly what Yojam would do - which rewrites fire, whether trackers get stripped, which rule matches, and where it ends up.

Settings can be exported as JSON and imported on another machine.

Permissions

  • App Group group.org.yojam.shared — shared storage between the main app and its extensions.
  • iCloud Key-Value Store — for settings sync (off by default).
  • Apple Events — for AppleScript-based private windows in Safari and Orion.
  • Accessibility — only required if you use per-rule display targeting to move browser windows after they open. Granted in System Settings > Privacy & Security > Accessibility.

The first time certain features are used, macOS will show:

  • A protocol-handler confirmation for yojam:// (from browser extension fallback path).
  • A prompt to enable the Share Extension (System Settings > Extensions > Sharing).
  • A prompt to enable the Safari Web Extension (Safari > Settings > Extensions).

Privacy

Everything happens locally on your Mac. Yojam doesn't phone home, track your clicks, or send your data anywhere. The Share Extension and browser extensions only hand a URL to the local Yojam process. The native messaging host only forwards URLs you explicitly trigger — it never reads page contents. Nothing hits the network.

The only network activity is iCloud sync (uses your own Apple ID, off by default) and checking for updates via yoj.am (can be disabled in Preferences).

Troubleshooting

  • Handoff link doesn't appear — Confirm Yojam is your default browser, and that Handoff is on in System Settings > General > AirDrop & Handoff.
  • Share Extension missing — Enable it in System Settings > Privacy & Security > Extensions > Sharing.
  • Browser extension button does nothing — Go to Preferences > Integrations and click "Reinstall Browser Helpers" to rewrite native messaging manifests.
  • Safari extension not showing — Enable it in Safari > Settings > Extensions.
  • AirDropped link file opens in Finder instead — Set Yojam as the default handler for .webloc from Preferences > Integrations.
  • Pre-release settings missing — This release stores all routing state in an App Group container. If you upgraded from a pre-release build, your old preferences in ~/Library/Preferences/com.yojam.app.plist are not read. Reconfigure from Preferences.

License

BSD 3-Clause. See LICENSE.

Why I built this

There are other browser pickers out there. I wanted one that felt invisible most of the time, stripped trackers globally, supported browser profiles as first-class citizens, and let me pass custom CLI arguments when I needed to do something weird.

Contributing

This project follows a hard-cut policy: we delete old-state compatibility code rather than carrying it forward. Any temporary migration or compatibility code must be called out in the same diff with why it exists, why the canonical path is insufficient, exact deletion criteria, and the task that tracks its removal.

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

7 total
  1. Yojam 1.2.1v1.2.1Jul 27, 20267 downloads

    Yojam 1.2.1 fixes the macOS 14 launch crash and the shared configuration file churn reported in #33 and #32. ## What changed - Moved macOS Services registration to the correct application lifecycle point, so Yojam launches normally on Sonoma. - Made the live configuration mirror independent of each Mac's installed apps and local timestamps. File watcher, debounce, import, and deletion handling are also stricter. - Kept every exported setting current in the shared file, including learned routing preferences. - Added explicit App Group provisioning for the app, Share extension, and Safari extension. - Tightened release checks for provisioning profiles, embedded extension versions, the Sparkle signing key, and exported build versions. ## Upgrade note If several Macs use the same configuration file, upgrade all of them before turning file sync back on. A Mac still running 1.2.0 can write the old machine-local state back into the file and restart the churn. If Yojam 1.2.0 crashes at launch on macOS 14, it cannot update itself. Install this DMG manually or run `brew upgrade --cask yojam` once the Homebrew update lands.

  2. Yojam 1.2.0v1.2.0Jul 20, 202613 downloads

    Yojam 1.2.0 clears the issue backlog and makes the browser-extension story considerably less theoretical. Highlights: - Link History keeps the ten most recent exact URLs in the menu bar, with retention controls and a clear action. - Holding Shift until the picker appears now skips rules, URL rewrites, and tracking-parameter stripping for that link. - Rewrite rules can be edited in place instead of being deleted and rebuilt. - The Safari Web Extension is correctly embedded, signed, versioned, and discoverable by Safari. - Firefox and Orion rules can target named containers. Missing containers fail closed instead of opening a sensitive link in the default context. - `tel:` routing, custom configuration paths, `app.notion.com` routing, local-file rules, and the recent browser-profile fixes are all included. The release includes `yojam-chrome.zip` as an unpacked Chrome-family extension and `yojam-firefox.xpi` for Orion or Firefox development builds. The Firefox XPI is not Mozilla-signed yet, so normal Firefox release builds will reject it until Yojam is published through AMO. Users on 1.1.4 or newer can update normally through Sparkle. Older builds affected by the previous signing-

  3. Yojam 1.1.4v1.1.4May 24, 202631 downloads

    ## Changes - Fixed profile-targeted routing for Chromium browsers, including Vivaldi and Chrome. Rules can now target a configured browser/profile entry directly, and Chromium launches pass the selected `--profile-directory` instead of falling back to the last active window. - Fixed rule editing so configured browser/profile targets are kept when a rule is reopened. - Improved Firefox profile support, including selectable-profile detection and custom launch argument handling. - Added drag-and-drop ordering for routing rules in the Link Handling pipeline. - Fixed machine-scoped rule sync conflicts. - Fixed the built-in Linear rule bundle ID and preserved app names chosen through "Choose App...". - Fixed Sparkle appcast signing/validation paths and aligned the release signing key. - Fixed Finder `.html` opens so the Yojam settings window does not stay visible behind the chooser. ## Download - DMG: https://yoj.am/releases/Yojam-1.1.4.dmg ## Notes - If you are on an earlier 1.1.x build, you may need to install this update manually from the DMG because the Sparkle release key was misaligned in those builds.

  4. Yojam 1.1.0v1.1.0May 6, 202687 downloads

    ## Changes - Bumped Yojam to 1.1.0. - Rolled the Sparkle EdDSA public key after the signing-machine upgrade. - Kept the Sparkle feed pointed at yoj.am for update delivery. ## Download - DMG: https://yoj.am/releases/Yojam-1.1.0.dmg - GitHub assets can be attached to this release after the DMG is uploaded. ## Notes - This release is effectively a 1.0.3 repack, using a new Sparkle signing key, as the original was lost during a laptop upgrade.

  5. Yojam 1.0.3v1.0.3May 6, 20269 downloads

    ## Changes - Fixed the release script so Sparkle appcast generation uses the correct yoj.am release download path. - Added Xcode Cloud setup for generated projects, package resolution retries, generated test Info.plists, and CI entitlement handling. - Added the Homebrew cask workflow, moved it to the `fluffypony/homebrew-yojam` tap, and cleaned up livecheck/zap behavior. - Restored local HTML file routing so `.html`, `.xhtml`, and `.htm` opens go through Yojam again. - Fixed routing behavior around profiles, source-app rules, and machine-scoped settings. - Updated README coverage for Firefox containers, per-rule overrides, config import, flat-file config, and Homebrew installation. ## Download - DMG: https://yoj.am/releases/Yojam-1.0.3.dmg - GitHub assets can be attached to this release after the DMG is uploaded. ## Notes - Updates continue to use the yoj.am Sparkle appcast. - This tag follows the requested `Bump version to 1.0.3` commit. That commit's project metadata records marketing version `1.0.4` (confusing, I know).

Commits per week

last 52 weeks
1240Week of 2025-08-10: 0 commitsWeek of 2025-08-17: 0 commitsWeek of 2025-08-24: 0 commitsWeek of 2025-08-31: 0 commitsWeek of 2025-09-07: 0 commitsWeek of 2025-09-14: 0 commitsWeek of 2025-09-21: 0 commitsWeek of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 46 commitsWeek of 2026-04-05: 124 commitsWeek of 2026-04-12: 4 commitsWeek of 2026-04-19: 50 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 10 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 13 commitsWeek of 2026-05-31: 4 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 0 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 2 commitsWeek of 2026-07-26: 8 commitsWeek of 2026-08-02: 0 commitsAug 10, 2025Aug 2, 2026
261 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 0 commitsSun 1:00 — 0 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 1 commitsSun 9:00 — 1 commitsSun 10:00 — 2 commitsSun 11:00 — 3 commitsSun 12:00 — 2 commitsSun 13:00 — 0 commitsSun 14:00 — 1 commitsSun 15:00 — 6 commitsSun 16:00 — 9 commitsSun 17:00 — 1 commitsSun 18:00 — 1 commitsSun 19:00 — 0 commitsSun 20:00 — 17 commitsSun 21:00 — 9 commitsSun 22:00 — 2 commitsSun 23:00 — 0 commitsMon 0:00 — 0 commitsMon 1:00 — 0 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 13 commitsMon 8:00 — 11 commitsMon 9:00 — 9 commitsMon 10:00 — 4 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 1 commitsMon 14:00 — 0 commitsMon 15:00 — 11 commitsMon 16:00 — 6 commitsMon 17:00 — 0 commitsMon 18:00 — 2 commitsMon 19:00 — 2 commitsMon 20:00 — 6 commitsMon 21:00 — 0 commitsMon 22:00 — 0 commitsMon 23:00 — 0 commitsTue 0:00 — 0 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 4 commitsTue 7:00 — 0 commitsTue 8:00 — 7 commitsTue 9:00 — 2 commitsTue 10:00 — 2 commitsTue 11:00 — 0 commitsTue 12:00 — 1 commitsTue 13:00 — 3 commitsTue 14:00 — 1 commitsTue 15:00 — 6 commitsTue 16:00 — 10 commitsTue 17:00 — 9 commitsTue 18:00 — 8 commitsTue 19:00 — 17 commitsTue 20:00 — 8 commitsTue 21:00 — 1 commitsTue 22:00 — 0 commitsTue 23:00 — 0 commitsWed 0:00 — 0 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 1 commitsWed 11:00 — 0 commitsWed 12:00 — 1 commitsWed 13:00 — 0 commitsWed 14:00 — 1 commitsWed 15:00 — 0 commitsWed 16:00 — 0 commitsWed 17:00 — 1 commitsWed 18:00 — 0 commitsWed 19:00 — 0 commitsWed 20:00 — 0 commitsWed 21:00 — 0 commitsWed 22:00 — 0 commitsWed 23:00 — 0 commitsThu 0:00 — 0 commitsThu 1:00 — 0 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 0 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 0 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 0 commitsThu 20:00 — 0 commitsThu 21:00 — 0 commitsThu 22:00 — 0 commitsThu 23:00 — 0 commitsFri 0:00 — 0 commitsFri 1:00 — 0 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 1 commitsFri 9:00 — 1 commitsFri 10:00 — 3 commitsFri 11:00 — 0 commitsFri 12:00 — 1 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 0 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 0 commitsFri 21:00 — 0 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 2 commitsSat 9:00 — 1 commitsSat 10:00 — 1 commitsSat 11:00 — 0 commitsSat 12:00 — 2 commitsSat 13:00 — 1 commitsSat 14:00 — 0 commitsSat 15:00 — 14 commitsSat 16:00 — 1 commitsSat 17:00 — 14 commitsSat 18:00 — 1 commitsSat 19:00 — 4 commitsSat 20:00 — 7 commitsSat 21:00 — 3 commitsSat 22:00 — 0 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits261 (99%)
Community commits3 (1%)

264 commits in total over the last year.

DateListRankStars gained
May 7, 2026daily#23+47
  • jaywcjlove/awesome-mac

     This project is dedicated to collecting high-quality macOS software and organizing them systematically by different categories for easy search and use.

    109.3K stars · Swift

  • apple/container

    A tool for creating and running Linux containers using lightweight virtual machines on a Mac. It is written in Swift, and optimized for Apple silicon.

    48.7K stars · Swift

  • permissionlesstech/bitchat

    bluetooth mesh chat, IRC vibes

    34.7K stars · Swift

  • manaflow-ai/cmux

    Open source Ghostty-based macOS terminal with vertical tabs and notifications for AI coding agents. Built for multitasking, organization, and programmability.

    25.7K stars · Swift

  • steipete/CodexBar

    Show usage stats for OpenAI Codex and Claude Code, without having to login.

    19.7K stars · Swift

  • supertone-inc/supertonic

    Lightning-Fast, On-Device, Multilingual TTS — running natively via ONNX.

    13.6K stars · Swift