Open-source project
fluffypony/yojam avatar
fluffypony/yojam

Yojam: a macOS default browser that routes every link to where you want it

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

797 stars409 forksSwiftBSD-3-Clause

At a glance

What is it?
Yojam sits in the default browser slot on macOS and decides, per rule, which browser, profile, container, display or private window a link should open in, then strips tracking parameters on the way. It also imports from Bumpr, Choosy and Finicky, and the author is explicit about the one thing it cannot do, which is complete a web authentication session back in the app that started it.
Who is it for?
Adopt Yojam if you juggle several browser profiles, work and personal identities, and Firefox or Orion containers, and you want one place to say which link goes where. Do not adopt it if you depend on an app's sign-in callback returning to the app that started it, because Yojam forwards the first URL of an authentication session and cannot send the callback back.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 38 days ago.
What is it written in?
Mainly Swift, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem is a link opening in the wrong identity

The README opens with the concrete annoyance that motivated the project. The author clicked a link in Slack and it opened in Safari, but they were logged into that AWS account in Chrome Profile 3, and the Figma link should have opened in the desktop app rather than another browser tab. Yojam fixes that by becoming the default browser, catching every link that is clicked and routing it according to rules the user defines, either straight to the right destination or to a fast picker that appears at the cursor so a choice can be made on the fly. The design assumption is that a modern macOS user has more than one browser identity in play at once, and that the operating system's single default browser setting is too blunt an instrument for that. Making itself the default browser is the mechanism, not a feature, and the app asks for that permission on first launch.

Rules can match on almost anything, and override browser defaults

The rules engine routes URLs by domain, prefix, regex, source app, or all links from a source, so a rule can say work links go to a corporate Edge profile and personal links go to Safari. The important part is what a rule can then override. Each rule can set a specific profile, turn private window on or off, supply custom launch arguments, choose a target display, restrict the rule to a particular machine, or name a Firefox or Orion container. The machine scope matters more than it first appears, because the configuration syncs across Macs through iCloud, and a rule that should only apply on your laptop needs a way to say so, which is what per-rule machine scope is for. The container option is the other half of the identity story, since a named container, Work or Personal or Banking, gives a different contextual identity inside one browser rather than a different browser entirely.

Tracking parameters are stripped before the browser sees them

The tracker scrubber removes utm_source, fbclid, gclid and 30 or more other tracking parameters before the browser ever sees the URL, either per browser or globally. This is the part of Yojam that is quietly useful even if you never write a routing rule, because it applies to every link that passes through, whatever the destination. The URL rewriting engine sits alongside it and does regex-based find and replace on URLs, and it ships with disabled-by-default examples for Twitter to Nitter, Reddit to Old Reddit and Medium to Scribe. The default-off choice for those three is the right call, since each of them points at a different front end with different terms, and shipping that on by default would be an imposition. The two features together are the argument for keeping Yojam in the default browser slot even if you route nothing.

Every way macOS offers a link reaches the same pipeline

What makes Yojam more than a default-browser handler is the breadth of sources it listens to, and the claim that none of them is second class. It catches clicks in any app that opens http or https URLs through the default browser path, and sign-in windows from apps that use ASWebAuthenticationSession, such as Slack and Claude. It handles Finder double-clicks on .html, .xhtml, .webloc, .inetloc and .url files, Handoff of pages continued from another Apple device, and AirDrop, where links arrive as .webloc files that Yojam unwraps transparently. The macOS Share menu works through a bundled Share Extension, the Services menu works for any URL highlighted in any Cocoa app, browser extensions exist for Safari, Chrome and Firefox, and a yojam:// URL scheme is there for Shortcuts, Raycast, Alfred and shell scripts. All of it goes through the same rule engine, tracker scrubber and rewrite pipeline as a direct click.

Authentication sessions are the documented limitation

There is one behaviour the README refuses to paper over, and it is the right one to notice first. Yojam forwards the first URL from a web authentication session to your chosen browser. It cannot see later navigation inside that browser, and it cannot send the callback to the source app. The consequence is spelled out: an app that depends only on the session callback can keep waiting after you finish the sign-in in the browser. Apps with a separate callback URL handler can still finish the sign-in. Yojam does not claim ephemeral-session support because the chosen browser keeps its cookies and profile state. This is a structural limit of the design rather than a missing feature, since routing a session into a different browser profile means the profile holds the resulting cookies, and nothing in the design can hand control back. If you use single sign-on from a native app, this is the thing to test before anything else.

Import from other routers, but parse rather than execute

On first launch, Quick Start finds installed apps and offers an import from Bumpr, Choosy or Finicky. The README is specific about how that import works. You review compatible routes, rewrites and conversion warnings before Yojam adds the selected items, and Yojam skips duplicates. The important word is parsed: Finicky configs are parsed, not run. That distinction matters, because running a foreign configuration file means executing code from another tool, and a router that reads your browsing rules is in a privileged position. A review step that shows you what will be imported, and that converts rather than executes, keeps the migration from becoming a trust problem. The rest of the configuration model is the same: a flat-file JSON copy of your setup at ~/Library/Application Support/Yojam/config.json, editable live, with edits in the file picked up by the app in real time and vice-versa, which the README suggests is good for dotfile repos or scripted changes.

Releases are signed, notarised and pushed through Sparkle

Installing it is a cask, and on first launch it asks to become your default browser:

bash
brew install --cask yojam

The release engineering section says the release script builds the app, signs it with Developer ID, notarises the DMG and generates signed Sparkle updates, with publishing the website and the GitHub release as separate steps. Preparing a release needs Xcode, XcodeGen, create-dmg and the GitHub CLI, and the signing Mac needs Apple Development and Developer ID Application certificates plus separate provisioning profiles for the main app, the Share Extension, the Safari Web Extension and the Yojam.app/Contents/Helpers/YojamNativeHost.app. The native messaging host having its own profile is a small sign of how many separate binaries ship here. End users do not deal with any of it, since updates are checked at yoj.am every hour, a dot appears on the menu bar icon, and the menu gains an Update to Yojam x.y.z entry with an Install Update button in Preferences. The licence is BSD-3-Clause, and the last push was on 2026-09-15, the same day as the 1.3.1 release.

Editorial conclusion

Adopt Yojam if you juggle several browser profiles, work and personal identities, and Firefox or Orion containers, and you want one place to say which link goes where. Do not adopt it if you depend on an app's sign-in callback returning to the app that started it, because Yojam forwards the first URL of an authentication session and cannot send the callback back. Before you commit, check the browser support on your machine, since profile targeting covers Chrome, Firefox, Brave, Edge, Vivaldi and Opera, and set up the rules incrementally rather than importing everything at once.

Frequently asked questions

What is Yojam?

It is a BSD-3-Clause licensed macOS app that becomes the default browser and routes each link to the browser, profile, container, display or private window you defined a rule for, while stripping tracking parameters and applying URL rewrites on the way through.

How do I install Yojam?

Through Homebrew with brew install --cask yojam, or by downloading the DMG from yoj.am and dragging it to your Applications folder. On first launch Yojam asks to become your default browser, and saying yes is how it intercepts links.

Can Yojam complete a web sign-in that started in another app?

No. Yojam forwards the first URL of a web authentication session to your chosen browser but cannot see later navigation inside it or send the callback to the source app. Apps with a separate callback URL handler can still finish, and the project does not claim ephemeral-session support because the browser keeps its cookies.

Can I import my rules from Bumpr, Choosy or Finicky?

Yes. On first launch Quick Start finds installed apps and offers an import, and you review compatible routes, rewrites and conversion warnings before Yojam adds the selected items, skipping duplicates. Finicky configurations are parsed rather than executed.

Official sources

  1. fluffypony/yojam on GitHub
  2. Issues
  3. License: BSD-3-Clause
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/fluffypony-yojam.svg)](https://hysenlabs.com/projects/fluffypony-yojam)

Was this useful?