A fast, native macOS URL router and browser picker.
- Native macOS app -- SwiftUI + AppKit, no Electron, no web views
- Browser picker -- popup appears near your mouse with all installed browsers
- Keyboard shortcuts -- press 1-9 for instant selection in the picker
- Rules engine -- route URLs automatically based on domain patterns, regex, and source app
- Source app detection -- match rules based on which app opened the URL
- Browser profiles -- open in specific Chrome profiles or Firefox profiles
- Private/incognito mode -- per-rule incognito support
- URL rewriting -- auto-strip tracking params, force HTTPS
- Copy URL -- copy button in the picker popup
- Recently used -- last-used browser gets a blue dot and moves to front
- Recent URLs -- quick access from the menu bar dropdown
- Launch at login -- optional startup item
- First-launch onboarding -- guided setup on first run
- Lightweight -- ~1.9MB DMG, ~10MB memory footprint
- macOS 14+ -- Apple Silicon and Intel
brew install laurenschristian/tap/openinGrab the latest .dmg from Releases, open it, and drag OpenIn to /Applications.
git clone https://github.com/laurenschristian/OpenInApp.git
cd OpenInApp
make installThis builds a Release binary and copies it to /Applications. Requires Xcode 15+ and macOS 14+. See Building from Source for more details.
- Open OpenIn from
/Applications - Go to Settings > General and click Set as Default Browser
- macOS will ask you to confirm
- Click any link -- OpenIn intercepts it
- If a rule matches, the URL opens in the target browser automatically
- If no rule matches, the picker popup appears near your mouse
- Click a browser or press 1-9
Config lives at ~/.config/openin/config.json. Edit it directly or use the Settings UI.
{
"defaultBrowserID": "com.apple.Safari",
"activateBrowser": true,
"showPickerOnNoMatch": true,
"rules": [
{
"name": "GitHub",
"pattern": "*.github.com",
"isRegex": false,
"targetBrowserID": "com.google.Chrome",
"enabled": true
},
{
"name": "Google Docs from Slack",
"pattern": "https://docs\\.google\\.com/.*",
"isRegex": true,
"sourceAppBundleID": "com.tinyspeck.slackmacgap",
"targetBrowserID": "com.google.Chrome",
"enabled": true
},
{
"name": "Work apps in Chrome Work profile",
"pattern": "*.atlassian.net",
"isRegex": false,
"targetBrowserID": "com.google.Chrome",
"browserProfile": "Profile 2",
"enabled": true
}
]
}Rules are evaluated top-to-bottom. The first match wins. If no rule matches, the picker appears (or the default browser is used, depending on your settings).
| Field | Required | Description |
|---|---|---|
name |
yes | Display name |
pattern |
yes | Glob or regex pattern to match against the URL |
isRegex |
no | true for regex, false for glob (default: false) |
targetBrowserID |
yes | Bundle ID of the target browser |
sourceAppBundleID |
no | Only match URLs opened from this app |
browserProfile |
no | Chrome profile directory or Firefox profile name |
openIncognito |
no | Open in private/incognito window |
enabled |
no | true or false (default: true) |
| Pattern | Type | Matches |
|---|---|---|
*.github.com |
glob | github.com, gist.github.com, docs.github.com |
*.google.com |
glob | mail.google.com, docs.google.com |
notion.so |
glob | Any URL containing notion.so |
*jira* |
glob | Any URL containing jira |
https://docs\\.google\\.com/.* |
regex | Google Docs URLs only |
https://(dev|staging)\\.example\\.com |
regex | Dev and staging environments |
| Browser | Bundle ID |
|---|---|
| Safari | com.apple.Safari |
| Chrome | com.google.Chrome |
| Firefox | org.mozilla.firefox |
| Arc | company.thebrowser.Browser |
| Brave | com.brave.Browser |
| Edge | com.microsoft.edgemac |
| Orion | com.kagi.kagimacOS |
OpenIn can automatically clean URLs before opening them:
- Tracking parameter removal -- strips
utm_source,utm_medium,utm_campaign,utm_term,utm_content,fbclid,gclid, and other common tracking parameters - Force HTTPS -- upgrades
http://URLs tohttps://automatically
This happens transparently before the URL is passed to the target browser.
OpenIn supports opening URLs in specific browser profiles.
Chrome -- use the profile directory name (found in chrome://version under "Profile Path"):
{
"name": "Work in Chrome Work Profile",
"pattern": "*.company.com",
"targetBrowserID": "com.google.Chrome",
"browserProfile": "Profile 2"
}Chrome is launched with --profile-directory="Profile 2".
Firefox -- use the profile name:
{
"name": "Dev in Firefox Dev Profile",
"pattern": "localhost*",
"targetBrowserID": "org.mozilla.firefox",
"browserProfile": "dev-profile"
}Firefox is launched with -P dev-profile.
Requirements:
- Xcode 15+
- macOS 14+
git clone https://github.com/laurenschristian/OpenInApp.git
cd OpenInApp
open OpenIn.xcodeproj- Select the OpenIn scheme
- Build and run (Cmd+R)
- To create a release build: Product > Archive
The built app can be copied to /Applications.
Contributions are welcome.
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes
- Push to the branch
- Open a pull request
Please open an issue first for major changes to discuss the approach.
MIT License. See LICENSE.
