fluffypony/yojamPublic

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

AI summary: A highly customizable macOS menu bar app that intelligently routes clicked links to specific browsers or profiles based on user-defined rules.

Stars
794
Forks
410
Watchers
6
Open issues
1
Open PRs
0
Contributors
~3
Commits
309
Branches
1

SwiftBSD-3-ClauseCreated Apr 4, 2026Last push 19d agoLatest release v1.3.1+3 stars this week+5 this month

Quick answers

What is yojam?
A highly customizable macOS menu bar app that intelligently routes clicked links to specific browsers or profiles based on user-defined rules.
What does yojam do?
Yojam is a lightweight macOS utility that intercepts web links globally and routes them to the correct browser, app, or specific profile based on a powerful rules engine. Instead of opening everything in a single default browser, Yojam evaluates clicked links against domain, prefix, or regex patterns to seamlessly separate work and personal workflows. It intercepts links from anywhere—Finder, Handoff, AirDrop, or custom URL schemes—and can optionally strip tracking parameters or rewrite URLs on the fly before launching the target application. All routing logic is stored in a live-reloaded JSON file for easy dotfile management.
Who is yojam for?
macOS power users, developers, and professionals who manage multiple browser profiles and require strict separation between different contexts.
How do I get started with yojam?
brew install --cask yojam
How popular is yojam on GitHub?
fluffypony/yojam has 794 stars and 410 forks on GitHub, and gained 3 stars in the last 7 days.
What license does yojam use?
fluffypony/yojam is released under the BSD-3-Clause license.

Star history

since Jul 29, 2026
0200400600Jul 2026Aug 2026Sep 2026Oct 2026
794 stars as of Oct 2, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-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 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 8 commits2026-08-26: 0 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 0 commits2026-09-01: 0 commits2026-09-02: 0 commits2026-09-03: 0 commits2026-09-04: 4 commits2026-09-05: 0 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 0 commits2026-09-09: 0 commits2026-09-10: 0 commits2026-09-11: 0 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 0 commits2026-09-15: 33 commits2026-09-16: 0 commits2026-09-17: 0 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 0 commits2026-09-23: 0 commits2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 0 commits2026-09-27: 0 commits2026-09-28: 0 commits2026-09-29: 0 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
306 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 is a lightweight macOS utility that intercepts web links globally and routes them to the correct browser, app, or specific profile based on a powerful rules engine. Instead of opening everything in a single default browser, Yojam evaluates clicked links against domain, prefix, or regex patterns to seamlessly separate work and personal workflows. It intercepts links from anywhere—Finder, Handoff, AirDrop, or custom URL schemes—and can optionally strip tracking parameters or rewrite URLs on the fly before launching the target application. All routing logic is stored in a live-reloaded JSON file for easy dotfile management.

macOS power users, developers, and professionals who manage multiple browser profiles and require strict separation between different contexts.

  • Global link interception: Captures and routes URLs clicked anywhere in macOS, including AirDrop, Handoff, and terminal commands.
  • Dynamic rules engine: Evaluates links against domain suffixes, regex patterns, or specific originating apps to determine the correct target browser.
  • Profile and container routing: Directs specific links precisely into named Chrome profiles or Firefox containers, keeping sessions isolated.
  • Privacy-focused tracker scrubbing: Automatically strips known tracking parameters from URLs before they are opened in the target browser.
  • Live flat-file configuration: Stores all routing logic in a hot-reloaded JSON file, making it perfectly suited for version control and dotfile repositories.
  • Multi-monitor targeting: Pin a rule's output to a specific display, opening specific domains only on specific screens.

Where teams use it

Work-life separation

Professionals automatically route links from Slack directly to their enterprise Chrome profile while keeping personal browsing isolated in Safari.

Automated privacy filtering

Privacy-conscious users ensure all clicked links are automatically scrubbed of tracking parameters before reaching the browser.

Cross-device continuity

Mac users seamlessly receive Handoff or AirDrop links from iOS and route them to specific desktop browser contexts.

Developer tool integration

Engineers trigger specific browser launches via terminal scripts and custom Shortcuts using Yojam's dedicated URL scheme.

Getting started: brew install --cask yojam

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.
  • Import from Bumpr, Choosy, or Finicky: On first launch, Quick Start finds installed apps and offers an import. Review compatible routes, rewrites, and conversion warnings before Yojam adds selected items. Yojam skips duplicates. Finicky configs are parsed, not run.
  • 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).
  • Sign-in windows from apps that use ASWebAuthenticationSession, such as Slack and Claude.
  • 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.

Yojam forwards the first URL from a web authentication session to your chosen browser. It cannot see later navigation inside that browser or send the callback to the source app. An app that depends only on the session callback can keep waiting after you finish 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.

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 yoj.am for updates every hour. When a new version is ready, a dot appears on the menu bar icon, the menu gains an Update to Yojam x.y.z… entry, Preferences shows an Install Update button, and Yojam posts a notification if you allow it. You can also check any time from Preferences > General > Updates, from the About tab, or 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.

Release engineering

The release script builds the app, signs it with Developer ID, notarises the DMG, and generates signed Sparkle updates. Publishing the website and GitHub release are separate steps.

Prepare the release

You need Xcode, XcodeGen, create-dmg, and the GitHub CLI. The signing Mac also needs:

  • Apple Development and Developer ID Application certificates, plus separate provisioning profiles for the main app, Share Extension, Safari Web Extension, and Yojam.app/Contents/Helpers/YojamNativeHost.app.
  • ExportOptions.plist in the project root, copied from ExportOptions.example.plist. Git ignores this file. Set teamID to your team, with method as developer-id and signingStyle as automatic. Keep only those three keys in the file.
  • Notarisation credentials in the YojamNotarize Keychain profile. Set YOJAM_NOTARIZE_PROFILE if you use another profile.
  • The existing Sparkle EdDSA key in Keychain. Its public key must match SUPublicEDKey in project.yml. Back up this key securely: replacing it can prevent installed copies from accepting updates. YOJAM_SPARKLE_PRIVATE_KEY_FILE can select an explicit signing key file; the script checks that it matches too.

Register the helper's explicit App ID, com.yojam.app.NativeHost, and associate it with the existing App Group group.org.yojam.shared. Create and install a macOS Development profile named Yojam Native Host Development for that App ID with access to the group. The helper target uses this profile with manual signing and the Apple Development identity for archive and debug builds. If you use another profile name, update the helper target's PROVISIONING_PROFILE_SPECIFIER in project.yml.

During Developer ID export, Xcode creates or selects the helper's distribution profile automatically. The App ID and its App Group association must exist before export: automatic export cannot create or change App IDs.

  1. For a Mac release, update MARKETING_VERSION and increment CURRENT_PROJECT_VERSION in project.yml. Sparkle compares the build number, so it must increase with every Mac release.
  2. Match Extensions/safari/manifest.json to the Mac version. Chrome and Firefox publish independently and can have different versions. Increment their respective manifests when you submit a new store package; store version numbers cannot be reused.
  3. Run swift test and node --test Tests/Extensions/*.test.mjs, then build the app with Xcode and test the changed flows. Check the bundled integrations as well: the Swift package alone does not build them.
  4. Commit the release changes. Keep Package.resolved committed; the release build uses its pinned dependencies.

For a browser-only release, update that browser's manifest and follow its store section below. Run ./scripts/release.sh --check-extension-versions to check the manifest versions before submission.

Build and sign

Keep the previous release DMGs in build/releases/ so Sparkle can generate delta updates. On a fresh checkout, copy those DMGs from the published releases before you build.

export RS_TEAM_ID="YOUR_APPLE_TEAM_ID"
./scripts/release.sh

The script validates the app bundle and signatures, checks the exported version, notarises and staples the DMG, then generates the appcast. Stop if any step fails. --skip-archive reuses an existing archive and checks its version; --skip-notarize is for local checks, not a public release.

The outputs are:

  • build/Yojam-<version>.dmg, the signed and notarised installer.
  • build/releases/appcast.xml, with the version, download URLs, file lengths, and Sparkle signatures.
  • The DMGs and any .delta files in build/releases/ that the appcast references. The script signs and verifies these update files.
  • Extensions/dist/yojam-chrome.zip and Extensions/dist/yojam-firefox.xpi. The Firefox XPI from this script is unsigned; Mozilla signing is a separate step.

Firefox Add-ons updates

Use the existing add-on in the AMO Developer Hub, with ID [email protected]. Choose Submit a new version, then On this site, for public distribution. Complete the listing details and keep compatibility set to desktop Firefox: the extension needs the Yojam Mac app. Mozilla requires two-step authentication on the developer account.

An existing unlisted version cannot be uploaded again as a public version, even if you delete it. Use a new version number in Extensions/firefox/manifest.json. Complete the first public submission in the Developer Hub so its listing metadata is present before you use the signing script for updates.

For later public updates, build the extensions, obtain API credentials from the AMO Developer Hub, and load them into WEB_EXT_API_KEY and WEB_EXT_API_SECRET. Keep them out of the repository and shell history. Then run:

./Extensions/sign-firefox.sh

This validates the extension for public distribution, submits it to the listed channel, and replaces Extensions/dist/yojam-firefox.xpi only when a signed package returns. If review exceeds the script's wait period, continue with that submission in the Developer Hub and download its signed XPI there. Check the public listing and approval status before announcing availability. A signature alone does not confirm public publication.

Keep versioned copies of signed Firefox packages and submitted Chrome ZIPs before another build: Extensions/build.sh recreates dist/. Record each extension's actual version in release notes when it differs from the Mac version.

Chrome Web Store updates

Upload Extensions/dist/yojam-chrome.zip through the Chrome Web Store Developer Dashboard. Use the existing store item for updates so its extension ID stays the same.

For the first submission, complete Google's publisher verification and upload the ZIP to obtain its store ID. Add that ID to Sources/Yojam/Resources/chrome-extension-ids.json as a JSON array, then rebuild the Mac app. Yojam uses this ID to allow the extension to contact its native helper. The app refreshes those helper registrations when their required content changes, including updates at the same app path.

Keep the listing's permission and data-use declarations aligned with the package. Supply real extension screenshots, link the privacy policy, and state that the extension needs Yojam on macOS 14 or later. Make the Mac build with the store ID available before the store extension goes live. After Google approves the submission, check a normal Chrome install and its connection to the Mac app.

Publish and verify

  1. Tag the release commit as v<version> and push the commit and tag.

  2. Publish the versioned DMG and every delta referenced by the appcast at https://yoj.am/releases/. Keep older files available for clients that cached an earlier feed.

  3. Replace https://yoj.am/yojam.dmg with the new DMG and publish the generated feed at https://yoj.am/appcast.xml. Make the download files available before the feed, or deploy them together atomically. Preserve the generated /releases/ enclosure URLs and signatures.

  4. Create the GitHub release for the tag. Attach the DMG and both extension packages, and include release notes with any installation requirements.

  5. Check the live feed and all its enclosure URLs. Verify that the hosted DMG has the same SHA-256 hash as the local release. Open an older installed version, use Check for Updates, and complete the update. Check the hourly update reminder too, including Preferences when the menu bar icon is hidden.

  6. Once the downloads are live, open the Homebrew cask update:

    brew bump --open-pr yojam

    If the command reports Cask is autobumped, leave the pull request to BrewTestBot. Homebrew runs these version bumps about every three hours. Check the resulting pull request for the version, download URL, and SHA-256 hash. If a pull request already exists, check that one instead of opening a duplicate.

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.

Discord ignores plain web links handed to it, so Yojam converts discord.com channel, message, and invite links (and discord.gg invites) to discord:// deep links at launch time. The URL tester shows the converted link.

Add your own rules matching on all URLs, domain (exact), domain suffix, URL prefix, URL substring, or regex. A rule can also filter by source app. Add several apps to the same rule to accept links from any of them; the URL condition still applies.

To send links from several work apps to one browser profile, create a rule in Link Handling, select All URLs, and add each app under Source Apps. Choose the target browser and its Profile, then save. You only need one rule, and iCloud sync keeps the source list together. Update each Mac to 1.3.0 or later before you use multi-app rules there.

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.authentication-session App sign-in session
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

Use Firefox 140 or later. Download yojam-firefox.xpi from the latest GitHub release, open it in Firefox, and confirm the installation. From Yojam 1.3.0, this download has a Mozilla signature and works in normal Firefox. Public store submissions use the Yojam listing on AMO; each version becomes available there after Mozilla approves it.

Firefox asks for permission to transfer browsing activity because the extension passes links to Yojam on your Mac. It does not upload those links to a server. To route into a container, create the container in Firefox and enter its name in the rule's Container field. The name must match an existing container.

Firefox checks AMO for newer public versions, including for these signed GitHub installations. You can also install a newer XPI from GitHub. Firefox and Mac app versions can differ. Sparkle updates the Mac app; it does not replace the Firefox extension.

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 shortcut — Alt+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. It guides you through default-browser registration. If Bumpr, Choosy, or Finicky is installed, it also offers to import compatible routes and rewrites.

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

Yojam routes URLs on your Mac. Browser and Share extensions pass URLs to the local app, and the browser popup can request a local routing preview. Yojam has no analytics or crash-reporting service.

Some features make network requests. Update checks contact yoj.am, and downloads may use hosts such as GitHub. Optional shortlink resolution contacts configured shortlink services, including during a preview. Optional iCloud sync sends browser configuration, routing rules, and related settings through your Apple account.

The Mac app can keep recent URLs and learned browser choices locally; its settings let you manage or clear them. If you enable Clipboard Monitoring, it checks copied text for web URLs and offers to open them. It does not keep a clipboard history.

See the privacy policy for the data handled by each feature and the available controls.

Troubleshooting

  • Handoff link doesn't appear — Confirm Yojam is your default browser, and that Handoff is on in System Settings > General > AirDrop & Handoff.
  • Services menu item missing or does nothing — Open Preferences > Integrations and click Repair next to Services menu. macOS keeps its own list of service providers and can keep pointing at an old copy of Yojam after an update or an OS upgrade. If the entry still does not appear, check System Settings > Keyboard > Keyboard Shortcuts > Services and make sure Open in Yojam is ticked. Releases before 1.2.4 declared the service in a way macOS treats as legacy, which left it switched off by default.
  • 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

12 total
  1. Yojam 1.3.1v1.3.1Sep 15, 202636 downloads

    Yojam 1.3.1 fixes the extension popup and repeated macOS permission requests from the browser helper. - Fixed the toolbar popup. The Open button now works while the routing preview loads, and a late preview cannot overwrite the result. - The popup reports errors from the local helper. If the helper is unavailable, the browser's confirmation tab stays open until you respond. - Chrome now routes links through the toolbar, context menu, or Option+Shift+Y. Removed Chrome's Always Route mode because returning a link to Chrome could create a routing loop. The extension now needs only `activeTab`, `contextMenus`, and `nativeMessaging` permissions. - Fixed repeated macOS permission requests from the native browser helper. It now has its own signed app identity and a provisioning profile for the shared routing settings. - Browser-helper registration refreshes when its extension IDs or configuration change, including updates that keep the app in the same folder. - Fixed Safari's routing and preview replies to use the shared response format, and corrected detection of Orion's container support. The privacy policy now explains local URL handling, saved history, clipboard monitoring, and opti

  2. Yojam 1.3.0v1.3.0Sep 15, 202610 downloads

    Yojam 1.3.0 lets one rule send links from several source apps to the same browser profile. It also fixes browser hyperlinks opened through the macOS Services menu, and the Firefox download now has a Mozilla signature. ## What changed - A rule can match any app in its Source Apps list. Add your work apps with Choose Apps, select the work browser profile, and save one rule. Existing single-app rules keep their settings. The full list syncs through iCloud; update each Mac to 1.3.0 before using multi-app rules there. - Open in Yojam now reads the destination of a hyperlink in rich text. Safari had been sending the link title as plain text and putting the actual URL in RTF, which Yojam discarded. This fixes the case where selected URL text worked but a right-clicked link did nothing. - The Firefox XPI is Mozilla-signed and installs in normal Firefox 140 or later. Rules can send matching links into an existing named container. If the container does not exist, the extension stops instead of opening the link outside it. - The README now covers the release process, including Sparkle signatures and the Homebrew update. Unit tests also have separate settings and config files, and Xcode's te

  3. Yojam 1.2.4v1.2.4Sep 4, 202629 downloads

    Yojam 1.2.4 fixes the three problems reported in #36, #37, and #38: Discord links that opened the app but went nowhere, a Services menu entry that macOS kept switched off, and updates that nobody got told about. ## What changed - Discord links now open the right channel, message, DM, or invite. Discord's desktop app ignores a plain web link, so Yojam hands it a `discord://` deep link instead. There are new built-in rules for `discord.com/invite/` and `discord.gg` links, and the URL tester in Link Handling shows the converted link. - "Open in Yojam" now appears in the Services menu without a trip to System Settings. Earlier releases declared the service in a way macOS treats as legacy, which leaves it unticked by default. The handler also only accepted URL objects, so a selected line of text did nothing even when the entry was ticked. Both are fixed. - Preferences > Integrations now shows whether macOS has the service registered, and for which copy of Yojam, with a Repair button that makes macOS rescan. - Yojam checks yoj.am for updates every hour instead of once a day, and it tells you when it finds one: a dot on the menu bar icon, an "Update to Yojam x.y.z…" entry at the top of

  4. Yojam 1.2.3v1.2.3Aug 25, 202645 downloads

    Yojam 1.2.3 rebuilds config import and fixes the two remaining authentication-session problems reported in #35. ## What changed - First launch now finds installed copies of Bumpr, Choosy, and Finicky and offers to import their rules. - Bumpr and Choosy imports now read their real config formats, including Choosy Chromium profiles. - Finicky 3 and 4 configs are parsed, never run. The importer supports static functions, regular expressions, arrays, browser objects, profiles, arguments, rewrites, `rules.json`, source apps, and each version's short-link rules. - The review step shows each compatible route, rewrite, and warning. Nothing is selected by default. Unsupported or incomplete conversions require manual review. - Finicky rule order, URL matching, profile arguments, web-only scope, and short-link behaviour carry over where Yojam can represent them. - Cold browser routes now start Chrome and other `.app` targets with their profile and custom arguments. - Yojam refreshes Launch Services after updates, so macOS recognises authentication routing without a restart. - Authentication-session URLs never enter Link History. This update clears all existing Link History entries once beca

  5. Yojam 1.2.2v1.2.2Aug 25, 20267 downloads

    Yojam 1.2.2 fixes #35. Slack, Claude, and other apps that use macOS web authentication sessions now go through Yojam instead of falling back to Safari. ## What changed - Registered Yojam as a web authentication session handler before macOS can deliver a cold-launch request. - Routed these requests through the normal rules, rewrites, and browser picker. - Added cancellation handling for queued requests and dismissed pickers. - Added `com.yojam.source.authentication-session` for rules that target sign-in sessions. ## One limitation Yojam can route the first sign-in URL, but it cannot see navigation after the chosen browser opens. Apps that rely only on the authentication session callback can still wait after sign-in. Apps with their own callback URL handler can finish normally. Yojam does not claim ephemeral session support, so the chosen browser uses its normal cookies and profile.

Commits per week

last 52 weeks
1240Week 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 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 0 commitsWeek of 2026-08-23: 8 commitsWeek of 2026-08-30: 4 commitsWeek of 2026-09-06: 0 commitsWeek of 2026-09-13: 33 commitsWeek of 2026-09-20: 0 commitsWeek of 2026-09-27: 0 commitsOct 5, 2025Sep 27, 2026
306 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 — 12 commitsTue 11:00 — 1 commitsTue 12:00 — 1 commitsTue 13:00 — 12 commitsTue 14:00 — 6 commitsTue 15:00 — 9 commitsTue 16:00 — 14 commitsTue 17:00 — 13 commitsTue 18:00 — 8 commitsTue 19:00 — 22 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 — 5 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 commits306 (99%)
Community commits3 (1%)

309 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.

    115.4K 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.

    50.4K stars · Swift

  • permissionlesstech/bitchat

    bluetooth mesh chat, IRC vibes

    36.3K 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.

    27.6K stars · Swift

  • steipete/CodexBar

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

    22.1K stars · Swift

  • Lakr233/vphone-cli

    14.8K stars · Swift