Skip to content

badaverse/linkprism

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

38 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

LinkPrism icon

LinkPrism

Stop juggling Chrome profiles.
Let your links find their way home.

Latest Release Platform: macOS 14+ Swift 5.9+ MIT License

πŸ‡°πŸ‡· ν•œκ΅­μ–΄


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.

Routing Rules settings

Profile picker popup

Menu bar dropdown

Installation

Download

Download the latest .dmg from GitHub Releases.

  1. Open the .dmg and drag LinkPrism to your Applications folder
  2. Launch LinkPrism β€” the onboarding wizard will guide you through setup
  3. 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.

Build from Source

git clone https://github.com/badaverse/linkprism.git
cd linkprism
open LinkPrism/LinkPrism.xcodeproj

Build and run with Xcode 15+ (requires macOS 14 Sonoma or later).

Chrome Extension (Recommended)

The macOS default browser handler can't intercept links clicked within Chrome. The extension solves this.

Option A β€” GitHub Release (recommended):

  1. Download LinkPrismExtension.zip from GitHub Releases
  2. Unzip the file
  3. Open chrome://extensions/ in Chrome
  4. Enable Developer mode (toggle in top-right)
  5. Click Load unpacked β†’ select the unzipped folder

Option B β€” From source:

  1. Clone or download this repository
  2. Open chrome://extensions/ in Chrome
  3. Enable Developer mode (toggle in top-right)
  4. Click Load unpacked β†’ select the LinkPrismExtension/ folder

Quick Start

  1. Launch β€” Open LinkPrism. The onboarding wizard walks you through the basics.
  2. Set as default browser β€” System Settings β†’ Desktop & Dock β†’ Default web browser β†’ LinkPrism
  3. Add your first rule β€” Click the menu bar icon β†’ Settings β†’ + button
    • Pattern: notion.so Β· Profile: Work Β· Type: Host
  4. 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.

What's New

  • 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

How It Works

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

Features

  • 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 State to 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

Tech Stack

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

Project Structure

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

Contributing

Contributions are welcome! Whether it's bug reports, feature requests, or pull requests β€” every bit helps.

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Translation

LinkPrism supports i18n via Xcode string catalogs. To add a new language:

  1. Open LinkPrism/LinkPrism/Localizable.xcstrings in Xcode
  2. Add your language and provide translations
  3. For the Chrome extension, add a locale folder under LinkPrismExtension/_locales/

See the open issues for known issues and feature requests.

License

This project is licensed under the MIT License β€” see the LICENSE file for details.

πŸ‡°πŸ‡· ν•œκ΅­μ–΄

About

Stop juggling Chrome profiles. Let your links find their way home.

Resources

License

Stars

Watchers

Forks

Contributors