A lightweight macOS menu bar utility that watches your clipboard for URLs and lets you instantly open them in any installed browser — with one click.
When you copy a URL on macOS, opening it in a browser other than your default requires manual effort: paste, switch app, navigate. Fusion Link Launcher removes that friction entirely.
Copy a URL → pick a browser → done.
- Sits silently in the menu bar with zero Dock presence
- Detects copied URLs automatically (polls clipboard every 0.5s)
- Dynamically discovers all installed browsers — Safari, Chrome, Brave, Firefox, Arc, Edge, Vivaldi, and any other app that can open URLs
- Shows a non-intrusive floating popup in the top-right corner, auto-dismisses after 8 seconds
- Cooldown deduplication — won't re-prompt for the same URL within a configurable window
- Optional URL normalization (adds
https://to bare domains likegithub.com) - Launch at login support via
SMAppService - Settings panel for all preferences
- macOS 13 Ventura or later
- Xcode 15+ (to build from source)
open FusionLinkLauncher.xcodeproj
Select your Team in Signing & Capabilities, then press Run (⌘R).
swiftc -parse-as-library \
-framework SwiftUI -framework AppKit -framework Foundation -framework ServiceManagement \
-target arm64-apple-macosx13.0 \
FusionLinkLauncher/Models/AppPreferences.swift \
FusionLinkLauncher/Models/BrowserApp.swift \
FusionLinkLauncher/Models/DetectedURLItem.swift \
FusionLinkLauncher/Services/LaunchAtLoginManager.swift \
FusionLinkLauncher/Services/HistoryStore.swift \
FusionLinkLauncher/Features/Settings/PreferencesStore.swift \
FusionLinkLauncher/Features/Clipboard/URLDetector.swift \
FusionLinkLauncher/Features/Clipboard/ClipboardMonitor.swift \
FusionLinkLauncher/Features/Browsers/BrowserDiscoveryService.swift \
FusionLinkLauncher/Features/Browsers/OpenURLService.swift \
FusionLinkLauncher/Features/Prompt/PromptViewModel.swift \
FusionLinkLauncher/Features/Prompt/PromptView.swift \
FusionLinkLauncher/Features/Prompt/PromptController.swift \
FusionLinkLauncher/Features/Settings/SettingsView.swift \
FusionLinkLauncher/App/StatusBarController.swift \
FusionLinkLauncher/App/AppDelegate.swift \
FusionLinkLauncher/App/FusionLinkLauncherApp.swift \
-o FusionLinkLauncher_bin
# Bundle it
mkdir -p FusionLinkLauncher.app/Contents/MacOS
cp FusionLinkLauncher_bin FusionLinkLauncher.app/Contents/MacOS/FusionLinkLauncher
cp FusionLinkLauncher/Resources/Info.plist FusionLinkLauncher.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleExecutable FusionLinkLauncher" FusionLinkLauncher.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.fusionlinklauncher.app" FusionLinkLauncher.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundlePackageType APPL" FusionLinkLauncher.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c "Set :LSMinimumSystemVersion 13.0" FusionLinkLauncher.app/Contents/Info.plist
open FusionLinkLauncher.appFusionLinkLauncher/
├── App/
│ ├── FusionLinkLauncherApp.swift # @main entry point
│ ├── AppDelegate.swift # Wires clipboard monitor → prompt
│ └── StatusBarController.swift # Menu bar icon + menu
├── Features/
│ ├── Clipboard/
│ │ ├── ClipboardMonitor.swift # NSPasteboard polling
│ │ └── URLDetector.swift # URL validation + normalization
│ ├── Browsers/
│ │ ├── BrowserDiscoveryService.swift # NSWorkspace browser discovery
│ │ └── OpenURLService.swift # Opens URL in chosen browser
│ ├── Prompt/
│ │ ├── PromptController.swift # NSPanel lifecycle
│ │ ├── PromptView.swift # SwiftUI popup UI
│ │ └── PromptViewModel.swift # Prompt state
│ └── Settings/
│ ├── SettingsView.swift # SwiftUI settings panel
│ └── PreferencesStore.swift # UserDefaults-backed preferences
├── Services/
│ ├── LaunchAtLoginManager.swift # SMAppService wrapper
│ └── HistoryStore.swift # In-memory URL history
├── Models/
│ ├── BrowserApp.swift
│ ├── DetectedURLItem.swift
│ └── AppPreferences.swift
└── Resources/
└── Info.plist
All clipboard processing happens locally on your device. No data is ever sent to any server, logged to disk, or shared with any third party. URL history is stored only in memory and cleared on quit (unless you enable persistent history in a future release).
MIT — see LICENSE.