Skip to content
A macOS app for customizing which browser to start
TypeScript Swift JavaScript Other
Branch: master
Clone or download

Latest commit

Latest commit 0f8d3e7 May 20, 2020


Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Update nodejs.yml May 13, 2020
Finicky.xcworkspace parsing of new apps working Jan 7, 2019
Finicky Allow partial url objects in config, format text in console May 13, 2020
config-api Allow partial url objects in config, format text in console May 13, 2020
.gitignore Multiple browsers (#72) Aug 16, 2019
LICENSE Update LICENSE and May 16, 2019 Correct XCode to Xcode May 20, 2020

Finickyfinicky logo - hand pointing downwards

Always open the right browser

Finicky is a macOS application that allows you to set up rules that decide which browser is opened for every link or url. With Finicky as your default browser, you can tell it to open Facebook or Reddit in one browser, and Trello or LinkedIn in another.

  • Decide what urls to open in what browser or app
  • Edit urls before opening them
  • Complete control over configuration using JavaScript

GitHub start GitHub release

Finicky screenshot

Table of Contents


  1. Installation alternatives:
  1. Create a file called .finicky.js with configuration (examples) in your home directory OR generate a basic configuration with Finicky Kickstart

  2. Start Finicky. Please allow it to be set as the default browser.

  3. And you're done. All links clicked that would have opened your browser are now first handled by Finicky.

Example configuration

Basic configuration

module.exports = {
  defaultBrowser: "Google Chrome",
  handlers: [
      // Open and urls in Safari
      match: finicky.matchHostnames(["", ""]),
      browser: "Safari"
      // Open any url including the string "workplace" in Firefox
      match: /workplace/,
      browser: "Firefox"
      // Open and * urls in Google Chrome
      match: finicky.matchHostnames([
        "", // match domain as string (to make regular expression less complicated)
        /.*\$/ // match all subdomains
      browser: "Google Chrome"

Rewrite urls

module.exports = {
  defaultBrowser: "Google Chrome",
  rewrite: [
      // Redirect all urls to use https
      match: ({ url }) => url.protocol === "http",
      url: ({ url }) => ({
        protocol: "https"
      // Avoid being rickrolled
      match: [
      url: "about:blank"

Advanced usage

module.exports = {
  defaultBrowser: "Google Chrome",
  options: {
    // Hide the finicky icon from the top bar
    hideIcon: true
  handlers: [
      // Open any link clicked in Slack in Safari
      match: ({ sourceBundleIdentifier }) =>
        sourceBundleIdentifier === "com.tinyspeck.slackmacgap",
      browser: "Safari"
      // You can get the path of the process that triggered Finicky (EXPERIMENTAL)
      match: ({ sourceProcessPath }) =>
        sourceProcessPath && sourceProcessPath.startsWith("/Applications/"),
      browser: "Firefox"
      match: [""],
      browser: {
        name: "Google Chrome Canary",
        // Force opening the link in the background
        openInBackground: true
      match: finicky.matchHostnames([""]),
      // Opens the first running browsers in the list. If none are running, the first one will be started.
      browser: ["Google Chrome", "Safari", "Firefox"]
      match: [""],
      // Don't open any browser for this url, effectively blocking it
      browser: null
      // Open links in Safari when the option key is pressed
      // Valid keys are: shift, option, command, control, capsLock, and function.
      // Please note that control usually opens a tooltip menu instead of visiting a link
      match: ({ keys }) => keys.option,
      browser: "Safari"


module.exports = {
  defaultBrowser: "Google Chrome",
  options: {
    // Hide the finicky icon from the top bar. Default: false
    hideIcon: false, 
    // Check for update on startup. Default: true
    checkForUpdate: true

Function parameters

// Options object:
// Available as the first parameter when using match, browser or url functions.

  "urlString": "", // The full URL string
  "url": { // The URL parsed into parts
    "username": "username",
    "host": "",
    "protocol": "http",
    "pathname": "/pathname/",
    "search": "search=test",
    "password": "password",
    "port": 3000,
    "hash": "hash"
  "keys": { // Status of modifier keys on keyboard. 
    "control": false,
    "function": false,
    "shift": false,
    "option": false,
    "command": false,
    "capsLock": false
  "sourceBundleIdentifier": "net.kassett.finicky", // The bundle identifier of the application that triggered the URL to be opened. Does not work for all apps, in which case it will be null.
  "sourceProcessPath": "/Applications/" // The path of the application that triggered. Does not work for all apps, in which case it will be null.

Configuration ideas

See the wiki page for other configuration ideas



Please file an issue for bugs, missing documentation, or unexpected behavior.

See Bugs

Feature Requests

Please file an issue to suggest new features. Vote on feature requests by adding a 👍.

See Feature Requests


Have any other questions or need help? Please feel free to reach out to me on Twitter.



Support development

If you want to help support further development of finicky, feel free to buy me a coffee on ko-fi.

Buy Me a Coffee at

Building from source

Install Xcode and Xcode command line tools and then run commands:

    git clone
    cd finicky/Finicky

When complete you'll find a freshly built Finicky app in build/release.

You can’t perform that action at this time.