Every link. Your choice. Zero friction.
The lightning-fast browser picker for Windows that routes URLs exactly where you want them β every single time.
You open Chrome for work, Firefox for personal browsing, Edge for that one internal app, and Brave for everything else. But Windows lets you pick only one default browser β and every link goes there, no matter what.
Switchy fixes that.
Click any link β Switchy intercepts it β a sleek, acrylic-glass picker floats up in under a second β you tap a key and it's open in exactly the right browser. You can even teach Switchy rules so work URLs go straight to Chrome, your team's Notion links open in Firefox, and everything else still asks you. Pure control, zero compromise.
- Instant browser picker β frameless, always-on-top acrylic window appears the moment a link is clicked; dismiss
with
Escor pick with1β9 - Two layout modes β vertical list or horizontal dock; switch in settings
- Timed auto-selection β optional countdown that opens your default browser automatically if no key is pressed; timer and duration are configurable
- Smart URL rules β domain (
d$), regex (r$), and substring (s$) patterns auto-open URLs without asking; force the picker with_Switchy - Alternate browser profiles β launch a browser's incognito or work-profile variant directly from the picker
- Single-instance IPC β a second click forwards its URL to the running picker over a named pipe; no double windows
- Native Windows feel β Acrylic backdrop on the picker, Mica on settings, frameless with custom drag region; looks right at home on Windows 11
- Auto-detect browsers β scans
StartMenuInternetregistry to find every installed browser in seconds - Icon extraction β rasterizes browser icons directly from executable resources at configurable sizes (16β256 px)
- Settings persist β all configuration saved to
%APPDATA%\Switchy\settings.json
switchy/
βββ main.go # Entry point & CLI modes (--register, --unregister, --settings)
βββ app.go # Wails-bound App struct β the frontend β backend bridge
βββ go.mod / go.sum
βββ wails.json
βββ .golangci.yml # golangci-lint configuration
β
βββ internal/ # Private Go packages
β βββ browser/
β β βββ launch.go # Launch browsers; DetectInstalled via registry; FilterLegacyIE
β β βββ icon_windows.go # Extract & rasterize HICON β base64 PNG (shell32/gdi32)
β βββ config/
β β βββ service.go # Load / Get / Save / Invalidate settings; schema migration
β β βββ types.go # UserSettings, Browser, AlternateLaunch, Ruleset, Rule, AppSettings
β βββ ipc/
β β βββ pipe.go # Named-pipe single-instance IPC (go-winio, \\.\pipe\SwitchyPipe)
β βββ registry/
β β βββ registry.go # Register / Unregister Switchy as Windows default browser
β βββ rules/
β βββ matcher.go # URL-to-browser rule engine (domain / regex / substring)
β
βββ frontend/ # Vue 3 + TypeScript + Tailwind CSS
β βββ eslint.config.js # ESLint 9 flat config (TS + Vue + Prettier-compat)
β βββ .prettierrc.json # Prettier config (no-semi, single-quote, Tailwind class sort)
β βββ .prettierignore
β βββ src/
β βββ App.vue # Root router β renders SelectorView or SettingsView
β βββ types.ts # Frontend type definitions (mirrors Go structs)
β βββ views/
β β βββ SelectorView.vue # Browser picker (vertical list or horizontal dock)
β β βββ SettingsView.vue # Configuration hub (browsers, rulesets, app settings)
β βββ components/
β β βββ BrowserList.vue # Vertical stacked browser list
β β βββ BrowserButton.vue # Single row item with icon, name, shortcut
β β βββ BrowserDock.vue # Horizontal dock layout
β β βββ BrowserDockTile.vue # Single dock tile with large icon and keycap badge
β β βββ UrlCard.vue # URL display with protocol icon and copy button
β β βββ BrowserEditor.vue # Browser config row in settings
β β βββ RulesetEditor.vue # Ruleset config row in settings
β βββ composables/
β β βββ useBrowserIcon.ts # Async icon loader (calls GetBrowserIconAt backend)
β βββ utils/
β βββ browser.ts # Shortcut key helpers, animation delay calculations
β βββ config.ts # Layout / overflow value normalizers
β
βββ build/ # Wails build assets
β βββ appicon.svg # Source logo β regenerate appicon.png / icon.ico from this
β βββ appicon.png # 1024Γ1024 app icon (used by Wails build)
β βββ windows/
β βββ icon.ico
β βββ info.json # Product metadata (version, company, copyright)
β βββ wails.exe.manifest
β βββ installer/
β βββ installer.iss # Inno Setup 6 script β Switchy_Installer.exe
β βββ project.nsi # NSIS script (wails build --nsis)
β
βββ scripts/
βββ build.ps1 # Full release build: Wails β switchy.exe β Inno Setup installer
| Tool | Version | Install |
|---|---|---|
| Go | 1.25+ | go.dev/dl |
| Wails CLI | v2 | go install github.com/wailsapp/wails/v2/cmd/wails@latest |
| Node.js | 18+ | nodejs.org |
| golangci-lint | latest | go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest |
| Inno Setup | 6 | jrsoftware.org (installer only) |
# From the switchy/ directory β hot-reload on both Go and Vue changes
wails devGo methods are also exposed as a dev server at http://localhost:34115 so you can call them from the browser DevTools.
cd frontend
npm run lint # report ESLint issues
npm run lint:fix # auto-fix what's fixable
npm run format # format all src files with Prettier
npm run format:check # CI-safe Prettier check (no writes)# Format
gofmt -w .
# Vet
go vet ./...
# Full lint (requires golangci-lint)
golangci-lint run ./...wails build -platform windows/amd64
# β build/bin/switchy.exe.\scripts\build.ps1
# β build/bin/Switchy_Installer.exeAfter building or installing, run once:
.\build\bin\switchy.exe --registerWindows will open Default apps settings β scroll to Web browser and select Switchy to complete the setup. ( Windows 10/11 requires this manual confirmation step; no app can bypass it.)
To remove Switchy from the registry:
.\build\bin\switchy.exe --unregisterRules are evaluated in order across enabled rulesets. The first match wins.
| Prefix | Type | Example | Matches |
|---|---|---|---|
d$ |
Domain | d$example.com |
example.com and *.example.com |
r$ |
Regex | r$^https://work\. |
Full URL matched against regex |
s$ |
Substring | s$/confluence/ |
URL contains the string |
| (none) | Substring | github.com |
Same as s$ |
Set a rule's browser target to _Switchy to force the picker even when other rules would match.
| Flag | Effect |
|---|---|
| (no flag, with URL argument) | Open the browser picker for the given URL |
--register |
Write Windows registry entries and open Default Apps settings |
--unregister |
Remove Switchy registry entries |
--settings |
Open the settings window |
Switchy is lovingly inspired by Hurl β a fantastic open-source browser picker for Windows that proved the concept beautifully. Switchy builds on that idea with a Wails-powered UI, native-pipe IPC, URL rule matching, and alternate browser profiles. Huge respect to the Hurl team for laying the foundation.
This repository uses agent-context to generate and maintain its
AI-agent context files (e.g., AGENTS.md). If you're working on Switchy with an AI assistant, those files provide the
grounding architecture, conventions, and module map needed to navigate the codebase effectively.
