A macOS menu bar app that puts an end to the daily annoyance of opening URLs in the wrong Chrome profile. Set up domain rules once β notion.so goes to Work, github.com goes to Personal β and every link you click just opens in the right place. Paired with a Chrome extension that catches even in-browser clicks, LinkPrism routes them seamlessly. No more copy-paste gymnastics. Just click and go.
Download the latest .dmg from GitHub Releases.
- Open the
.dmgand drag LinkPrism to your Applications folder - Launch LinkPrism β the onboarding wizard will guide you through setup
- Set LinkPrism as your default browser in System Settings β Desktop & Dock β Default web browser
Note: On first launch, macOS may show a security prompt. Right-click the app and choose Open to bypass Gatekeeper.
git clone https://github.com/badaverse/linkprism.git
cd linkprism
open LinkPrism/LinkPrism.xcodeprojBuild and run with Xcode 15+ (requires macOS 14 Sonoma or later).
The macOS default browser handler can't intercept links clicked within Chrome. The extension solves this.
Option A β GitHub Release (recommended):
- Download
LinkPrismExtension.zipfrom GitHub Releases - Unzip the file
- Open
chrome://extensions/in Chrome - Enable Developer mode (toggle in top-right)
- Click Load unpacked β select the unzipped folder
Option B β From source:
- Clone or download this repository
- Open
chrome://extensions/in Chrome - Enable Developer mode (toggle in top-right)
- Click Load unpacked β select the
LinkPrismExtension/folder
- Launch β Open LinkPrism. The onboarding wizard walks you through the basics.
- Set as default browser β System Settings β Desktop & Dock β Default web browser β LinkPrism
- Add your first rule β Click the menu bar icon β Settings β + button
- Pattern:
notion.soΒ· Profile:WorkΒ· Type: Host
- Pattern:
- Test it β Click any Notion link and watch it open in your Work profile
Tip: Use Ask mode for domains you use across multiple profiles (like
github.com). LinkPrism will pop up a profile picker each time β and you can check "Don't ask again" to remember your choice for that specific URL.
- Rule sync server β Local HTTP server syncs rules to the Chrome extension in real time
- Auto profile detection β Extension auto-detects the current Chrome profile via
chrome.identity - Smart routing β Extension performs client-side rule matching and only reroutes when the current profile doesn't match
- URL remembering β "Don't ask again for this URL" saves your profile choice per URL
- Settings redesign β Menu bar + settings window separation with sidebar navigation
- Remembered URLs panel β View and manage saved URL-to-profile associations per rule
- i18n β English + Korean support
- Auto-update β Check for new versions from the menu bar
- Onboarding wizard β 3-step guided setup for new users
- Help guide β In-app docs for pattern matching and extension setup
- Rebranding β Renamed from ProfileRouter to LinkPrism
graph LR
A["π Link clicked"] --> B{"Source?"}
B -->|"External app"| C["LinkPrism receives URL"]
B -->|"Inside Chrome"| D["Extension matches rules"]
D -->|"Wrong profile"| C
D -->|"Correct profile"| I["No action needed β"]
C --> E{"Match rules"}
E -->|"Domain / regex match"| F["Open in matched profile β"]
E -->|"Ask rule"| G["Profile picker popup"]
E -->|"No match"| H["Open in default Chrome"]
G -->|"User selects"| F
J["RulesServer :19384"] -.->|"Sync rules"| D
| Component | Role |
|---|---|
| LinkPrism.app | macOS menu bar app. Intercepts http/https URLs as the default browser and routes them to the right Chrome profile based on your rules. |
| Chrome Extension | Catches link clicks inside Chrome (which the OS-level handler can't intercept). Syncs rules from the app via a local HTTP server, performs client-side rule matching, and auto-detects the current Chrome profile. |
| Local Rule Server | Lightweight HTTP server on 127.0.0.1:19384 that serves rules and profile data to the Chrome extension. |
- Domain & regex rules β Route by exact host (
notion.so), wildcard (*.atlassian.net), or full regex (github\.com/my-org/.*) - Auto-detect Chrome profiles β Reads Chrome's
Local Stateto discover all your profiles automatically - "Ask every time" mode β Show a profile picker popup when you're unsure which profile to use
- Remember URL choices β Check "Don't ask again for this URL" and LinkPrism remembers your preference
- Menu bar resident β Lives quietly in your menu bar, hidden from the Dock
- Rule management β Add, edit, delete, toggle, and drag-to-reorder your routing rules
- Guided onboarding β 3-step setup wizard gets you running in under a minute
- Auto-update β Checks GitHub Releases so you never miss an update
- i18n β English and Korean (more languages welcome!)
- Chrome extension β Catches in-browser link clicks, syncs rules from the app, and auto-detects the current profile
- Import / Export β Back up and restore your routing rules as JSON
| Component | Technology |
|---|---|
| macOS App | Swift, SwiftUI, AppKit |
| Chrome Extension | JavaScript, Manifest V3, Chrome Identity API |
| Rule Sync | Local HTTP server (127.0.0.1:19384) |
| Build | Xcode 15+ |
| Config | ~/Library/Application Support/LinkPrism/rules.json |
| Auto-Update | GitHub Releases API |
LinkPrism/
βββ LinkPrism/ # macOS SwiftUI app
β βββ App/ # LinkPrismApp, AppDelegate, URL handling
β βββ Models/ # Rule, RememberedRoute
β βββ Services/ # Router, URLRouter, ChromeProfileScanner,
β β # ConfigManager, RulesServer,
β β # RememberedRouteManager, UpdateChecker
β βββ Views/ # Settings, ProfilePicker, Onboarding,
β # MenuBarContent, Help, About,
β # RememberedURLs, RuleEditor, Debug
βββ LinkPrismExtension/ # Chrome extension (Manifest V3)
β βββ background.js # Rule sync via local server, profile detection
β βββ content.js # Link interception + client-side rule matching
β βββ popup.html/js # Connection status, profile selector, rule sync
β βββ icons/ # Extension icons (16, 48, 128)
β βββ _locales/ # i18n (en, ko)
βββ assets/ # README images
Contributions are welcome! Whether it's bug reports, feature requests, or pull requests β every bit helps.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
LinkPrism supports i18n via Xcode string catalogs. To add a new language:
- Open
LinkPrism/LinkPrism/Localizable.xcstringsin Xcode - Add your language and provide translations
- For the Chrome extension, add a locale folder under
LinkPrismExtension/_locales/
See the open issues for known issues and feature requests.
This project is licensed under the MIT License β see the LICENSE file for details.


